繁体   English   中英

RegEx连续比赛

[英]RegEx consecutive matches

我在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不允许这种递归?

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

请注意,“单词边界”也适用于破折号,点等。因此, this-test - more. 在以下位置将具有边界: |this|-|test| - |more|. |this|-|test| - |more|. 通常这是可取的,但是与\\s行为差异是值得了解的。

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

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

即,以字符串开头和结尾作为非单词字符的非单词字符后接单词字符,或单词字符后接非单词字符。 (但请注意\\b为零宽度,因此它不仅仅是该表达式的简写形式)

正则表达式失败,因为您需要每个单词之间有一个空格,并且正则表达式搜索不重叠。 正则表达式实际上开始寻找一个空格,一个1-3个字母的单词,然后是另一个空格。 它确定的第一个在is 由于空间之后is采取了由第一场比赛, one不能匹配,因为它没有前包含空格。 正则表达式匹配如下:

......这is一个样本of文本...

解决此问题的一种简单方法是将\\s更改为\\b \\b查找包含空格但不包含实际字符的单词中断。 因此,正则表达式\\b[az]{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[az]{1,3}\\s

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM