为什么这个正则表达式不填充变量$ 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很自然地出现了。 请原谅我的英文。
答案 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 ;;