如何匹配模式并在Perl中排除字符串中的另一个模式

时间:2012-07-19 23:31:38

标签: perl expression matching

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

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

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

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

4 个答案:

答案 0 :(得分:2)

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

类似的东西:

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

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

答案 1 :(得分:2)

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

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

会这样做。但如果您还想在可能的领先空间后检查abc,那么您需要

打印“$ _ \ n”表示grep / ^ \ s * abc /,@ array;

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

答案 2 :(得分:0)

这应该有用,它使用负向前瞻:

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

新想法......

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

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

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

表达式不会消耗abc后面的任何文本,并且如果之前只有任何内容,则表达式将匹配该点。

答案 3 :(得分:0)

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