Perl,模式后面的任何匹配字符串

时间:2012-08-27 18:58:08

标签: regex string perl matching any

我正在尝试匹配某个模式后是否存在任何字符串。 模式是“模式”'介于'[后]之间的任何东西。不区分大小写。

例如

pattern 1 [after] ABC
pattern 2 [after] 123 abc DEX
pattern 3 [after] 
pattern 12345123 [after]
pattern @ASd#98 @_90sd [after] xyz dec
[after] 4 pattern

所以我想获得的结果是,

pattern 1 [after] ABC
pattern 2 [after] 123 abc DEX
pattern @ASd#98 @_90sd [after] xyz dec

以“模式”开头,以“[之后]结束,夹在中间的任何东西也被接受。

我很难纳入[]&的分界词。如果字符串一起存在。

我已经尝试过,最接近我最终匹配

m/pattern/ ../ \[after]/

pattern 1 [after] ABC
pattern 2 [after] 123 ABC DEX
pattern 3 [after] 
pattern 12345123 [after]
pattern @ASd#98 @_90sd [after] xyz dec

但我不需要第3或第4个模式,因为它在“[after]”之后没有任何数字或字符。

由于

3 个答案:

答案 0 :(得分:2)

以下是我用来测试你的输入的代码(我刚刚捕获并通过管道输入脚本)

#!/usr/bin/perl

while(<>)
{
    print if (/^pattern.*\[after\]\s*\S+/);
}

所以要为你分解:

/^pattern:匹配任何以“pattern”

开头的字符串

.*\[after\]:匹配后跟“[after]”的所有字符

\s*\S+:匹配0个或更多空白字符,后跟一个或多个非空白字符

这应该足以让你在你认为合适时进行调整。

答案 1 :(得分:1)

代码:

$str = 'pattern 2 [after] 123 abc DEX';

if ($str =~ m/^pattern\s+(\d+)\s+\[after\]\s+(.+)/) {
  print "$1\t$2\n";
} else {
  print "(no match)\n";
}

输出:

2   123 abc DEX

测试此代码here

答案 2 :(得分:0)

这就是你想要的:

/pattern [0-9] \[after\](?= .)/s

/pattern [0-9] \[after\] ./s