正则表达式匹配牛津逗号或连续逗号

正则表达式匹配牛津逗号或连续逗号

我学习了一个正则表达式,可以检测带牛津逗号的句子和不带牛津逗号的句子。例如

对于下面的句子

I went to the store and bought eggs, milk, apples, butter, and bread.

我将使用

(?:\w+,\s+){2,}and\s+\w+   

以及

I went to the store and bought eggs, milk, apples, butter and bread.

我将使用

(?:\w+,\s+){1,}\w+\s+and\s+\w+. 

它使用 Perl 在 Ultraedit 中运行良好。

但是,我正在使用一款名为 SDL Studio 的软件,它是一种 Cat 工具(翻译工具),它可以使用正则表达式,但由于某种原因,它不接受上述正则表达式。您能否告诉我,使用更标准的正则表达式引擎,是否有任何其他可能比上述公式更有效的正则表达式公式?

答案1

字符类 ( \w,\s和其他)是Perl 正则表达式。最常支持的替代方法是方括号中的字符集:[a-zA-Z]用于字母,[0-9]以及[ \t\n]用于空格。当然,这假设除了纯 ASCII 中的 26 个英文字母之外没有其他字母,并且还会忽略几个较罕见的空格字符。还有命名的字符类,类似[[:alpha:]]这样的工作方式,但可能有些地方它们不起作用。

(?:...)也是一个 Perlism,(...)如果您对捕获括号内的匹配部分不感兴趣,则可以用它来替换。

因此,我尝试将第一个 RE 转变为:

([[:alpha:]]+,[[:space:]]+){2,}and[[:space:]][[:alpha:]]+

或者更简单,更直接,更不具普遍性:

([a-z]+, +){2,}and +[a-z]+ 

两者都适用于启用了扩展正则表达式的 GNU grep(-E命令行标志),并且在某种程度上是标准的,但当然您的应用程序支持的可能不一样。下一个有问题的构造是{N,M}计数匹配,替换起来相当烦人,因为您需要重复上一组。(但请注意,这(...){1,}与 完全相同(...)+。)

这里有关于常用正则表达式的参考regex(7)手册页如果你真的想知道细节和不同版本之间的区别,请参阅为什么我的正则表达式在 X 中有效,但在 Y 中无效?在 unix.SE。

相关内容