我正在研究一个Perl函数(或者我应该说子例程?)并且它对于Perl(和正则表达式)来说相对较新。
除了一个简单的部分外,整个过程都有效...需要使用正则表达式的if语句。
我需要检查是否有字符串:
我写的正则表达式是^\s*{\[$testString\]}?$
这不起作用。但是,我根本无法使用正则表达式,所以我想知道我是否正确使用它。
现在我正在使用的测试用例,我希望if为真的字符串是[fallback_test]
。
当我这样做时
if ($string eq ' [fallback_test]')
然后它的工作原理。但是,如果我这样做
if ($string =~ /fallback_test/)
然后它不会像它应该进入if块。理想情况下,它将使用我编写的正则表达式:
^\s*{\[$testString\]}?$
所以我的问题是......
答案 0 :(得分:0)
假设您有类似:my $testString = "fallback_test";
尝试:/^\s*\[${testString}\]?$/
答案 1 :(得分:0)
您需要对可选字符串进行分组。这是工作示例:
$string =~ /^\s*(?:\[.*?\])?$/;
这是perl oneliner测试:
perl -e 'die "not matched!" unless " [fallback_test]" =~ /^\s*(?:\[.*?\])?$/'
说明:
在regexp (subpattern)
groups子模式中,将匹配的结果存储在$ 1 .. $ 9变量中。
(?:subpattern)
分组子模式,但不存储匹配结果。
.*?
将匹配所有字符,直到第一个']'字符。您可能希望将此替换为您的测试字符串,例如'fallback_test'或'test',或者您可以使用某些正则表达式来满足您的要求。
另请注意,此正则表达式将匹配空行。
答案 2 :(得分:0)
所以需要分组而不是{} ?, use()?
FWIW你的正则表达式只会匹配4个不同的组合,因为你已经锚定了 与^ $绑定边界,并有2个可选的子表达式。
1''空字符串
2''所有空格
3'[string]'只是[string]
4'[string]'空格后跟[string]
如果这只是一个正则表达式中的事实发现,你总是可以捕获两个 子表达式并稍后测试对您有意义的结果。
例如:
修改将quotemeta添加到正则表达式
if($ str =〜/ ^(\ s *)(\ [\ Q $ testString \ E \])?$ /){
..字符串为2美元
..领先空间$ 1美元
但如果需要[string],那么一个更好的正则表达式将是
/^(\s*)\[\Q$testString\E\]$/
,如果它包含可选的空格,则测试$ 1。
答案 3 :(得分:0)
为什么要在正则表达式中添加花括号?它们用于说明重复次数,例如/\d{5}/
。
做你想做的事情应该是:
$string =~ m/^ ?(?:\[\Q$testString\E\])?$/
当在正则表达式中解释元字符时, \Q...\E
可以避免运行时错误。
考虑到你要求的正则表达式也会匹配空行,除非你的意思。