我想使用环视来匹配字符串的一部分,但前提是该行中不包含其他单词。
一些熊在树林里生活和进食。
在上面的行中,我想找到“eat in the”(在“live and”和“woods”之间):
/(?<=\blive and\b).*?(?=\bwoods\b)/
但前提是“bears”不在该行之外,无论是在环视之后、之前还是之间。
其他不应返回匹配的行示例是:
有些动物在树林里生活和吃东西,比如熊。
有些动物在树林里生活和吃熊。
如何将此条件添加到我的正则表达式中?
我想使用环视来匹配字符串的一部分,但前提是该行中不包含其他单词。
一些熊在树林里生活和进食。
在上面的行中,我想找到“eat in the”(在“live and”和“woods”之间):
/(?<=\blive and\b).*?(?=\bwoods\b)/
但前提是“bears”不在该行之外,无论是在环视之后、之前还是之间。
其他不应返回匹配的行示例是:
有些动物在树林里生活和吃东西,比如熊。
有些动物在树林里生活和吃熊。
如何将此条件添加到我的正则表达式中?
这是有问题的,因为大多数风格不支持可变长度的后视,所以你不能检查整行。一个简单的方法是匹配整行而不是使用环视:
^(?!.*\bbears\b).*?\blive and\b(.*?)\bwoods\b
在这里,之前的整场比赛是第一个捕获组。根据您的使用情况,它可能会使替换此文本不太方便。确保使用 muliline 标志 ( /m
),而不是设置单行标志 (dot-all 或/s
)。
工作示例:http ://rubular.com/r/TuADb2vB4w
请注意,如果您可以分两步解决问题,问题将变得非常简单:过滤掉带有 的行\bbears\b
,并匹配想要的字符串。
在 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
在此处阅读有关正则表达式条件的更多信息
您的问题和示例似乎不匹配,但您可以执行以下操作:
(?!.*\bbears\b)(?<=\blive and\b).*?(?=\bwoods\b)
(只是扩展了你的正则表达式)