Perl Regex ..简单if语句

时间:2011-10-22 19:05:29

标签: regex perl

我正在研究一个Perl函数(或者我应该说子例程?)并且它对于Perl(和正则表达式)来说相对较新。

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

我需要检查是否有字符串:

  • 以可选的空格
  • 开头
  • 在空格包含方括号内的0或1个字符串实例之后..(即[test])

我写的正则表达式是^\s*{\[$testString\]}?$

这不起作用。但是,我根本无法使用正则表达式,所以我想知道我是否正确使用它。

现在我正在使用的测试用例,我希望if为真的字符串是[fallback_test]

当我这样做时

if ($string eq ' [fallback_test]')

然后它的工作原理。但是,如果我这样做

if ($string =~ /fallback_test/)

然后它不会像它应该进入if块。理想情况下,它将使用我编写的正则表达式:

^\s*{\[$testString\]}?$

所以我的问题是......

  • 为什么正则表达式对我不起作用?
  • 当我让正则表达式在这个块中正常工作时,那个正则表达式是否会按照我的意愿行事吗?

4 个答案:

答案 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可以避免运行时错误。

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