Regex Perl正则表达式。。简单if语句

Regex Perl正则表达式。。简单if语句,regex,perl,Regex,Perl,我正在研究一个Perl函数(或者我应该说是子程序?),并且对Perl(和正则表达式)比较陌生 除了一个简单的部分外,整个过程都很有效。。。需要使用正则表达式的if语句 我需要检查字符串是否: 以可选的空白开始 空格后包含0或1个方括号内的字符串实例。。(即[测试]) 我编写的正则表达式是^\s*{\[$testString\]}?$ 这是行不通的。但是,我根本无法将其用于正则表达式,因此我想知道我是否正确地进行了操作 现在我正在处理的测试用例,我希望if为true的字符串是[fallback

我正在研究一个Perl函数(或者我应该说是子程序?),并且对Perl(和正则表达式)比较陌生

除了一个简单的部分外,整个过程都很有效。。。需要使用正则表达式的if语句

我需要检查字符串是否:

  • 以可选的空白开始
  • 空格后包含0或1个方括号内的字符串实例。。(即[测试])
我编写的正则表达式是
^\s*{\[$testString\]}?$

这是行不通的。但是,我根本无法将其用于正则表达式,因此我想知道我是否正确地进行了操作

现在我正在处理的测试用例,我希望if为true的字符串是
[fallback\u test]

当我这样做的时候

if ($string eq ' [fallback_test]')
然后它就起作用了。然而,如果我这样做

if ($string =~ /fallback_test/)
然后它不会像应该的那样进入if块。理想情况下,它将使用我编写的正则表达式:

^\s*{\[$testString\]}?$
所以我的问题是

  • 为什么正则表达式对我不起作用
  • 当我让正则表达式在这个块中正常工作时,正则表达式会做我想要的事情吗

假设您有如下内容:
my$testString=“fallback\u test”


尝试:
/^\s*\[${testString}\]?$/

您需要对可选字符串进行分组。下面是一个工作示例:

$string =~ /^\s*(?:\[.*?\])?$/;
下面是要测试的perl oneliner:

perl-e'die“不匹配!”除非“[回退测试]”=~/^\s*(?:\[.*?\])?$/”

说明:

在regexp
(子模式)
中,将子模式分组,并将匹配结果存储在$1..$9变量中。
(?:子模式)
将子模式分组,但不存储匹配结果。
*?
将匹配所有字符,直到第一个']'字符。您可能希望用“fallback\u test”或“test”之类的测试字符串或一些正则表达式来替换它,以满足您的需求


还要注意,这个regexp将匹配一个空行。

因此需要一个分组而不是{}?,请使用()

FWIW您的正则表达式将只匹配4个不同的组合,因为您已经锚定了
边界上带有^$的行,具有2个可选子表达式

1''空字符串
2''所有空格 3'[string]'只是[string]
4'[string]'空格后跟[string]

如果这只是一个正则表达式中的事实发现,那么您总是可以同时捕获这两个正则表达式
子表达式,稍后测试对您有意义的结果

例如:
编辑将quotemeta添加到正则表达式

如果($str=~/^(\s*)(\[\Q$testString\E\])?$/){
..为字符串测试$2
…前导空格测试1美元

但是如果需要[string],则更好的正则表达式是

/^(\s*)\[\Q$testString\E\]$/
,然后测试$1是否包含可选空格。

为什么要在正则表达式中添加花括号?它们用于说明重复次数,例如,
/\d{5}/

要想做你想做的事情,应该是:

$string =~ m/^ ?(?:\[\Q$testString\E\])?$/
\Q…。\E
可以避免在正则表达式中解释元字符时出现运行时错误


考虑到你所要求的正则表达式也会匹配空行,除非你是故意的。

你还有其他问题。正则表达式
/fallback\u test/
非常好,并且会匹配。
$string
如果不匹配,就不是你想象的那样。Craig说,如果他使用匹配的表达式,则不会执行if块n、 另一种可能是执行if块,但由于匹配表达式的副作用,其行为不同。例如,他的if块可能使用一个由匹配表达式更改的特殊变量。可能是这样的。基本上,当我添加正则表达式时,我的整个程序挂起,我无法计算out问题是什么..@Craig-如果
^\s*(?:\[$testString\])?$
导致了问题,那么$testString中的某些内容就像元字符一样。它们必须事先转义,或者将正则表达式更改为
^\s*(?:\[\Q$testString\E\])?$
^\s*(?:\Q[$testString]\E)?$
。你可能想了解什么是元字符。为什么?
/fallback\u test/
很好。@BrianRoach:这不是他的问题。他的要求是项目符号。这只是他做的一个简单的测试用例,他说失败了。我建议你重新阅读他的问题。如果/fallback\u test/没有,问题根本不在于正则表达式match@BrianRoach:理解git go的问题,
这只是他做的一个简单的测试用例,他说失败了。
。上面应该是对的,他的正则表达式放错了
{}
,然而,你是对的……他有别的错误,除了正则表达式。--问题仍然是正则表达式,而不是其他什么错误,因为他没有显示足够的内容。如果$string是他认为的那样,这不会失败。你可以告诉他使用世界上任何正则表达式,但它也不会匹配。谢谢你的回答……你的答案上面的答案和其他答案在其他不应该匹配的字符串上都出现了类似的问题…regex中的[]范围“e-d”无效;在您的示例中用@Craig方括号标记看起来是错误的。“[”和“]”是regexp中的特殊符号,如果您想匹配它们,应该将其转义。