正则表达式匹配String中的单个字符

时间:2014-02-19 11:00:27

标签: java javascript regex

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

例如,如果我有:

" 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"

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

2 个答案:

答案 0 :(得分: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)中添加。
另外,为了确保在此字符位于一个空格(或字符串的结尾)之后但是不在匹配中包含此空格,您可以使用(?=\s+|$)机制,如String newString = yourString.replaceAll("(^|\\s+)\\w(?=\\s+|$)","");

所以在Java的情况下尝试

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

和JavaScript

\w

BTW [a-zA-Z0-9_]会匹配[a-zA-Z]中的任何字符,因此如果您只想要字母,可以将其更改为{{1}}。

答案 1 :(得分: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"