我的目标是匹配模式前不包含'#'的模式,例如:
array = ("# abc", "# abcd" "abc" " abc ", "abcd" "abc # foo")
我想匹配“abc”。 “abc”。 “A B C D” 。 “abc#foo” 我需要什么正则表达式才能匹配不包含'#'的'abc'模式?
我尝试了m/[^#]+abc/g
,但它不起作用。
答案 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
。