RegEx连续比赛

时间:2014-06-04 20:44:35

标签: javascript regex

我在Javascript中使用此正则表达式删除3个字母或更少的字词:

srcText = srcText.replace(/\s[a-z]{1,3}\s/gi,'');

它可以工作但是当找到两个连续匹配时,第二个不受影响:

例:

“......这是一个文本样本......”

除非我再次运行代码,否则

'one''a'不会受到影响:

srcText = srcText.replace(/\s[a-z]{1,3}\s/gi,'');

所以我必须运行代码n次, n 是srcText中的连续匹配。

用于测试目的:

http://regexpal.com/

示例文本:

http://www.gutenberg.org/files/521/521-0.txt(比如说​​,第4段)

我的正则表达式遗漏了什么,或者javascript不允许这种递归?

2 个答案:

答案 0 :(得分:5)

JavaScript的正则表达式(以及大多数其他正则表达式)支持\b转义序列,它匹配(零宽度)字边界。在您的表达式中,只需将两个\s替换为\b即可。

请注意&#34;字边界&#34;也适用于破折号,点等。因此this-test - more.将具有以下界限:|this|-|test| - |more|.通常这是可取的,但它与\s的行为有所不同,值得了解。< / p>

Sam在评论中指出,单词边界被标识为:

(^\w|\w\W|\W\w|\w$)

,即一个非单词字符后跟一个单词字符,或一个单词字符后跟一个非单词字符,其中字符串的开头和结尾被视为非单词字符。 (但请注意\b为零宽度,因此它不仅仅是该表达式的简写)

答案 1 :(得分:1)

正则表达式失败,因为您需要在每个单词之间留出空格,并且正则表达式搜索不重叠。正则表达式基本上开始寻找一个空格,一个1-3个字母的单词,然后是另一个空格。它标识is处的第一个。由于is之后的空格被第一次匹配占用,one无法匹配,因为它之前不包含空格。正则表达式匹配如下:

...此is一个样本of一个文字......

解决此问题的一种简单方法是将\s更改为\b\b查找包含空格的分词符,但不包括匹配中的实际字符。所以正则表达式\b[a-z]{1,3}\b将匹配如下:

...此is one示例of a文字......

现在可以找到所有三个字母的单词,可以像这样用来替换所有单词:

> var str = "... this is one sample of a text ... ";
> `srcText = srcText.replace(/\b[a-z]{1,3}\b/gi,'');`
  "... this   sample   text ... "

然而...

这包括删除了单词的额外空格。如果你想要删除那些空格并且确定你没有额外的间距,那么继续使用匹配间距after但不是之前的东西。这样,当有单词时,将删除相等数量的空格。正则表达式看起来像:\b[a-z]{1,3}\s

如果你需要更复杂的东西,请告诉我。