0

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

例如

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

它以 "pattern" 开头并以 "[after] 结尾,任何夹在中间的东西也被接受。

我很难将 [ ] & if string 的分隔符合并在一起。

我试过了,我得到的最接近的结果是匹配的

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]”之后不包含任何数字或字符。

谢谢

4

3 回答 3

2

这是我用来针对您的输入进行测试的代码(我只是将其分类并通过管道传输到脚本)

#!/usr/bin/perl

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

所以为你分解它:

/^pattern: 匹配任何以“pattern”开头的字符串

.*\[after\]: 匹配后面跟“[after]”的任何字符

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

这应该给你足够的工作来调整它,因为你认为合适。

于 2012-08-27T22:06:29.887 回答
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

在此处测试此代码。

于 2012-08-27T19:14:59.193 回答
0

这是你想要的吗:

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

或者

/pattern [0-9] \[after\] ./s
于 2012-08-27T19:02:39.507 回答