Perl RegExp可选搜索分组

时间:2018-01-22 18:18:19

标签: regex perl

为什么这个正则表达式不填充变量$ 1。我怎样才能做到这一点?

my $txt = "abc def ghi jkl mnop";
$txt =~ /(def)?/;

$ 1是undef

my $txt = "abc def ghi jkl mnop";
$txt =~ /(abc)?/;

这样可行。

只有在存在非可选部分时才会起作用,例如“\ s(def)?”但这并不是第一部分。

The Thing ist我需要一个regexp,它返回Always,并填充$ 1 aso。

编辑: 非常感谢您的支持。我会让你更深入地了解这个问题。

在我的代码中,$ txt和RegExp是用户输入。应该给出单个单词或成对被挑出的可能性,但不管顺序如何。

我的想法是将RegExp拆分为与订单无关的部分,然后自己测试每个部分。

例如

  /(ghi) jkl (def)? (ABC)?/

应该是成功的。所以在将它们分成几部分之后再进行几次测试。

  /(ghi) jkl/ && /(def)?/ && /(abc)?/

对于每个测试,将特定标量添加到数组中。出于这个原因(订单独立性),这个完全可选的RegExp很自然地出现了。 请原谅我的英文。

3 个答案:

答案 0 :(得分:3)

模式(def)?匹配以下两种情况之一:“def”或空字符串。它将首先尝试“def”,但如果它没有找到它,它将成功并且不匹配。

可以在任何字符串中的任何位置匹配空字符串,这意味着可以匹配字符串中第一个位置的空字符串,这意味着引擎没有理由查看任何< em>稍后位置以查看它是否可以找到“def”。

如果没有更好的例子来说明你要做什么就很难给出建议,但你需要修改模式以使其与空字符串不匹配,或者提供一些上下文来强制它尝试“def”匹配在正确的位置。

答案 1 :(得分:0)

根据评论,您希望正则表达式始终为true,但如果该单词存在则捕获该单词。

这将是:

/^(?:.*?(def))?/s

答案 2 :(得分:0)

使用的regx没有捕获所有预期的情况。&#39;(def)?&#39;只会匹配&#39; def&#39; char后跟0个或更多字符。 然而,你试图匹配任何地方&def;#def;当下。

以下代码有助于匹配&#39; def&#39;在字符串中,无论位置如何。

$ txt =〜/(。)?(def)(。)?/;

打印&#34; $ 2&#34 ;;