我在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://www.gutenberg.org/files/521/521-0.txt(比如说,第4段)
我的正则表达式遗漏了什么,或者javascript不允许这种递归?
答案 0 :(得分:5)
JavaScript的正则表达式(以及大多数其他正则表达式)支持\b
转义序列,它匹配(零宽度)字边界。在您的表达式中,只需将两个\s
替换为\b
即可。
请注意"字边界"也适用于破折号,点等。因此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
如果你需要更复杂的东西,请告诉我。