4

我想使用环视来匹配字符串的一部分,但前提是该行中不包含其他单词。

一些熊在树林里生活和进食。

在上面的行中,我想找到“eat in the”(在“live and”和“woods”之间):

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

但前提是“bears”不在该行之外,无论是在环视之后、之前还是之间。

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

有些动物在树林里生活和吃东西,比如熊。

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

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

4

3 回答 3

4

这是有问题的,因为大多数风格不支持可变长度的后视,所以你不能检查整行。一个简单的方法是匹配整行而不是使用环视:

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

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

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

请注意,如果您可以分两步解决问题,问题将变得非常简单:过滤掉带有 的行\bbears\b,并匹配想要的字符串。

于 2011-05-23T05:01:01.580 回答
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

在此处阅读有关正则表达式条件的更多信息

于 2011-05-23T05:37:04.333 回答
1

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

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

(只是扩展了你的正则表达式)

于 2011-05-23T05:02:31.267 回答