2014-02-19 218 views
0

我想要一个正则表达式用空格替换单个字符(或删除它们)。正则表达式匹配字符串中的单个字符

例如,如果我有:

" I have played u with no i and no j o o o o x w x x s" 

它应该返回:

" have played with no and" 

我曾尝试:

\s+\w{1}\s+ 

但是,当我使用它,我得到:

" have played with no and no o o x x s" 

我错过了什么?我认为这与某种“重叠比赛”有关。

+0

它应该是“玩过没有和没有”?第一个太空是故意的吗? – elclanrs

+1

显示一些代码(你如何使用这个正则表达式)。 –

+5

Java还是JavaScript? – nhahtdh

回答

2

你的正则表达式的工作原理是这样的:

找到space然后一个字符然后又space,并将其删除。在这种情况下,围绕一个字符空格不能在另一个字符的测试就像在

_a_b_c 
^^^ -this part matches our pattern so it will be removed leaving 

b_c and now neither `b` or `c` is surrounded with spaces so they will not 
    be removed 

情况下匹配要解决这个问题就在比赛包括一个或多个空格(字符串或者开始)和一个字符之后它就像(^|\s+)\w一样。
此外,为了确保在此字符在leas一个空格(或字符串的结尾)之后,但未在匹配中包含此空格,可以使用look-ahead机制,如(?=\s+|$)

所以在Java中的情况下,尝试

String newString = yourString.replaceAll("(^|\\s+)\\w(?=\\s+|$)",""); 

,并在JavaScript

var replaced = text.replace(/(^|\s+)\w(?=\s+|$)/g,"") 

BTW \w将任何字符从[a-zA-Z0-9_]匹配,所以你可以把它改成像[a-zA-Z],如果你只想要字母。

+0

我不知道Lookahead运算符(从未使用过)。谢谢,那正是我正在寻找的。 – mfcabrera

+0

(^ | \ s ++)\ w(?= \ s ++ | $)最终使用此修改。 – mfcabrera

1

我假设语言是JavaScript(请检查您的标签)。我看到的问题是你的正则表达式包含空格,所以如果你有“aa b c”,那么它与“a”匹配,但是c之前或之后没有空格。

var text=" a bb c dd e f g tt" 
var re=/\s*\b\w\b/g //If you're coding in Java, remove the g: "\\s*\\b\\w\\b" 
text.replace(re,"") //" bb dd tt" 
+0

其实这很简单...我错过了字边界算子。 – mfcabrera

+1

@mfcabrera我会说这可能太简单了,因为它也会接受'I''中的'I'和'm'。 – Pshemo

+0

我不知道为什么有人投票...它不像看起来那么“直截了当”。 – mfcabrera

相关问题