Regex 与Perl兼容的正则表达式,用于测试两个单词中的哪一个先出现
我得到一个字符串,其中包含一个逗号分隔的单词列表(其中空格和大小写不重要),我需要一个Perl regexp来测试以下内容:该字符串包含(完整的)单词“french”,而(完整的)单词“english”不在前面出现。例如,我想接受“法语”、“foobar、法语”、“bar、法语、quux、英语”、“法语、英语、法语”;但拒绝“foo,bar”,“english,french”,“foo,english,bar,french,english” 我的目标是在lighttpd配置中使用此类regexp。确切地说,我想解析Accept语言头,使用简单的启发式方法,将语言按递减的优先顺序列出,这通常是正确的,尽管RFC没有规定。因此,我只能有一个与Perl兼容的正则表达式,不能使用Perl的任何其他特性Regex 与Perl兼容的正则表达式,用于测试两个单词中的哪一个先出现,regex,perl,Regex,Perl,我得到一个字符串,其中包含一个逗号分隔的单词列表(其中空格和大小写不重要),我需要一个Perl regexp来测试以下内容:该字符串包含(完整的)单词“french”,而(完整的)单词“english”不在前面出现。例如,我想接受“法语”、“foobar、法语”、“bar、法语、quux、英语”、“法语、英语、法语”;但拒绝“foo,bar”,“english,french”,“foo,english,bar,french,english” 我的目标是在lighttpd配置中使用此类regexp
根据形式语言理论,这样的正则表达式必须存在,但简单的解决方案需要regexp否定,这很难执行。(这就是为什么我用“french”和“english”而不是“fr”和“en”来提问的原因,在这里,regexp否定将是乏味的,但可以手工操作。)是否有任何特定于Perl的regexp特性,可以为我的任务编写一个简洁的regexp,或者有没有一个工具可以自动编译一个regexp来执行此操作?类似的东西应该可以工作 更新
在“法语”之前的第一个“英语”中失败,仅其:
# /(?i)^(?:(?!\benglish\b).)*?\bfrench\b/
(?i) # Case insensitive
^ # BOS
(?:
(?! \b english \b )
.
)*?
\b french \b # 'french'
原件:“法语”之前的任何“英语”都不及格
# /(?i)^(?!.*\benglish\b.*\bfrench\b).*\bfrench\b/
(?i) # Case insensitive
^ # BOS
(?! # Not 'english' .. 'french'
.*
\b english \b
.*
\b french \b
)
.*
\b french \b # Must contain 'french'
是的,你可以。这叫做前瞻性断言。他们让你表达“foo不跟bar”。相反,后面也有“foo-preceded by-bar”这可以用正则表达式完成,正如其他注释/答案所示,但是为什么呢?只需迭代列表中的单词(用逗号分隔)并将它们与您的两个目标单词进行比较将更简单、更高效、更容易编码…@twalberg OP已经指出:“我的目标是在lighttpd配置中使用这种类型的regexp。”他们没有编写完整的Perl脚本。这似乎是失败的“french,english,french”被拒绝,但它应该被接受。我尝试使用look-behind as
(?I)(?但这不起作用:“变量长度lookbehind未在regex中实现”。@a3nm您应该能够用类似(?:(!english)。*
的内容替换负面lookbehind。