RegEx - 与条件外观相匹配?

时间:2011-05-23 04:53:39

标签: regex conditional lookaround

我想使用lookarounds匹配字符串的一部分,但仅当行中不包含其他字时。

  

有些熊在树林里生活和吃饭。

在上面的一行中,我想找到“吃在里面”(在“生活与”和“森林之间”):

/(?<=\blive and\b).*?(?=\bwoods\b)/

但是,只有当“熊”不在线之外时,无论是在外观之前,之前还是之间。

不应返回匹配的行的其他示例是:

  有些动物生活和吃东西   树林,像熊一样。

     

有些动物生活和吃熊   树林里。

如何将这个条件添加到我的正则表达式中?

3 个答案:

答案 0 :(得分:4)

这是有问题的,因为大多数口味都不支持可变长度的后视,因此您无法检查整条线。一种简单的方法是匹配整行而不是使用外观:

^(?!.*\bbears\b).*?\blive and\b(.*?)\bwoods\b

这里,以前的整场比赛是第一个捕捉组。根据您使用它,可能会使替换此文本不太方便。确保使用muliline标志(/m),而不是设置单行标志(dot-all或/s)。

工作示例: http://rubular.com/r/TuADb2vB4w

请注意,如果您可以分两步解决问题,则问题会变得非常简单:使用\bbears\b过滤掉行,并匹配所需的字符串。

答案 1 :(得分:2)

Perl:

use strict;
use warnings;

my $a = "Some bears live and eat in the woods.";

#$a = "Some animals live and eat in the woods, like bears.";

$a = "Some animals live and eat bears in the woods.";

$a =~ /(?(?!.*bears.*)(.*\blive and\b(.*)\bwoods\b.*)|(.{0}))/g;

print $2;

条件?(?!.*bears.*)就像

if the string contains the bears string
   then matches .*\blive and\b(.*)\bwoods\b.*
   else matches .{0}

您不需要在live andwoods

之间进行匹配

详细了解Regex Conditionals here

答案 2 :(得分:1)

您的问题和示例似乎不匹配,但您可以执行以下操作:

(?!.*\bbears\b)(?<=\blive and\b).*?(?=\bwoods\b)

(刚扩展你的正则表达式)