我学习了一个正则表达式,可以检测带牛津逗号的句子和不带牛津逗号的句子。例如
对于下面的句子
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。