我想使用lookarounds匹配字符串的一部分,但仅当行中不包含其他字时。
有些熊在树林里生活和吃饭。
在上面的一行中,我想找到“吃在里面”(在“生活与”和“森林之间”):
/(?<=\blive and\b).*?(?=\bwoods\b)/
但是,只有当“熊”不在线之外时,无论是在外观之前,之前还是之间。
不应返回匹配的行的其他示例是:
有些动物生活和吃东西 树林,像熊一样。有些动物生活和吃熊 树林里。
如何将这个条件添加到我的正则表达式中?
答案 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 and
和woods
答案 2 :(得分:1)
您的问题和示例似乎不匹配,但您可以执行以下操作:
(?!.*\bbears\b)(?<=\blive and\b).*?(?=\bwoods\b)
(刚扩展你的正则表达式)