Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 与Perl兼容的正则表达式,用于测试两个单词中的哪一个先出现_Regex_Perl - Fatal编程技术网

Regex 与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

我得到一个字符串,其中包含一个逗号分隔的单词列表(其中空格和大小写不重要),我需要一个Perl regexp来测试以下内容:该字符串包含(完整的)单词“french”,而(完整的)单词“english”不在前面出现。例如,我想接受“法语”、“foobar、法语”、“bar、法语、quux、英语”、“法语、英语、法语”;但拒绝“foo,bar”,“english,french”,“foo,english,bar,french,english”

我的目标是在lighttpd配置中使用此类regexp。确切地说,我想解析Accept语言头,使用简单的启发式方法,将语言按递减的优先顺序列出,这通常是正确的,尽管RFC没有规定。因此,我只能有一个与Perl兼容的正则表达式,不能使用Perl的任何其他特性


根据形式语言理论,这样的正则表达式必须存在,但简单的解决方案需要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。