0

我的目标是匹配模式前不包含“#”的模式,例如:

array = ("# abc", "# abcd" "abc" " abc ", "abcd" "abc # foo")

我想匹配“abc”。“ABC”。“A B C D” 。“abc # foo” 我需要什么正则表达式才能仅匹配不包含“#”的“abc”模式?

我试过m/[^#]+abc/g了,但它不起作用。

4

4 回答 4

2

寻找正则表达式后瞻和前瞻。

像这样的东西:

m/^(?<!#).*/g

可能会起作用,这是一个负面的看法。

于 2012-07-19T23:40:14.783 回答
2

你的标准一点都不清楚。你想拒绝任何#作为第一个字符的东西吗?

print "$_\n" for grep /^[^#]/, @array;

会这样做。但是,如果您还想检查abc可能的前导空格,那么您需要

打印 "$_\n" 为 grep /^\s*abc/, @array;

这些从您的数据中产生相同的结果并选择您说想要的项目。

于 2012-07-20T01:02:21.937 回答
0

#如果您以前不想要任何地方abc,那么您几乎就在那里。试试这个:^[^#]*abc

于 2012-07-19T23:53:49.457 回答
0

这应该可行,它使用负前瞻:

^[^#]*abc(?!(.*#))

新的想法...

我再次仔细阅读了您的问题,发现我并没有完全理解您的意思。你的意图真的很困惑,我可以肯定地说,如果字符串在同一行中有 1 个或多个 # 在 abc 后面,你不想得到匹配(我猜你不在乎是否还有其他东西或不在他们之间)。我很困惑,因为您明确地说您想匹配“abc # foo”,但同时又语无伦次地说“只匹配不包含 '#' 的 'abc' 模式”。

如果我们要遵循这种新的解释,正确的正则表达式可能是:

(?<!(#.*))abc.*

该表达式不会使用 abc 后面的任何文本,并且如果之前的任何内容根本不包含 # 则从该点开始匹配。

于 2012-07-19T23:48:25.623 回答