Ruby Regex:之前无限匹配的负向前瞻

时间:2015-02-13 20:13:04

标签: ruby regex negative-lookahead

我试图能够匹配如下的短语:

I request a single car
// or
I request a single person
// or
I request a single coconut tree

但不是

I request a single car by id
// nor
I request a single person by id with friends
// nor
I request a single coconut tree by id with coconuts

这样的工作:

/^I request a single person(?!\s+by id.*)/

对于这样的字符串:

I request a single person
I request a single person with friends

但是当我用匹配器(。*)替换这个人或者将$添加到结尾时,它就会停止工作:

/^I request a single (.*)(?!\s+by id.*)$/

我如何才能完成此操作,但仍然会在第一场比赛中匹配所有在否定前瞻之前?

2 个答案:

答案 0 :(得分:1)

好的,我想我得到了它。在提出问题之后。在我想要捕获的东西之后创建前瞻,而不是在之前创建一个前瞻我要捕获的东西,如下所示:

/^I request a single (?!.*by id.*)(.*[^\s])?\s*$/

答案 1 :(得分:1)

)中没有((.*\)匹配"I request a single car by idea" =~ /^I request a single (?!.*by id.*)(.*)$/ #=> nil 。自从你测试以来,也许这是一个错字。然而,在确定之后,仍然存在问题:

r = /^I request a single (?!.+?by id\b)/

据推测,那应该是一场比赛。如果您只想知道是否匹配,可以使用:

"I request a single car by idea" =~ r               #=> 0 
"I request a single person by id with friends" =~ r #=> nil

然后:

\b

"single "匹配分词,其中包括前一个字符是字符串中最后一个字符的情况。请注意,如果您只是在检查匹配项,那么除了否定前瞻之外,不需要包含任何内容。

如果您希望在匹配时返回r = /^I request a single (?!.+?by id\b)(.*)/ "I request a single coconut tree"[r,1] #=> "coconut tree" "I request a single person by id with friends"[r,1] #=> nil 后面的内容,请使用:

{{1}}