我的目标是匹配模式前不包含“#”的模式,例如:
array = ("# abc", "# abcd" "abc" " abc ", "abcd" "abc # foo")
我想匹配“abc”。“ABC”。“A B C D” 。“abc # foo” 我需要什么正则表达式才能仅匹配不包含“#”的“abc”模式?
我试过m/[^#]+abc/g
了,但它不起作用。
我的目标是匹配模式前不包含“#”的模式,例如:
array = ("# abc", "# abcd" "abc" " abc ", "abcd" "abc # foo")
我想匹配“abc”。“ABC”。“A B C D” 。“abc # foo” 我需要什么正则表达式才能仅匹配不包含“#”的“abc”模式?
我试过m/[^#]+abc/g
了,但它不起作用。
寻找正则表达式后瞻和前瞻。
像这样的东西:
m/^(?<!#).*/g
可能会起作用,这是一个负面的看法。
你的标准一点都不清楚。你想拒绝任何#
作为第一个字符的东西吗?
print "$_\n" for grep /^[^#]/, @array;
会这样做。但是,如果您还想检查abc
可能的前导空格,那么您需要
打印 "$_\n" 为 grep /^\s*abc/, @array;
这些从您的数据中产生相同的结果并选择您说想要的项目。
#
如果您以前不想要任何地方abc
,那么您几乎就在那里。试试这个:^[^#]*abc
。
这应该可行,它使用负前瞻:
^[^#]*abc(?!(.*#))
新的想法...
我再次仔细阅读了您的问题,发现我并没有完全理解您的意思。你的意图真的很困惑,我可以肯定地说,如果字符串在同一行中有 1 个或多个 # 在 abc 后面,你不想得到匹配(我猜你不在乎是否还有其他东西或不在他们之间)。我很困惑,因为您明确地说您想匹配“abc # foo”,但同时又语无伦次地说“只匹配不包含 '#' 的 'abc' 模式”。
如果我们要遵循这种新的解释,正确的正则表达式可能是:
(?<!(#.*))abc.*
该表达式不会使用 abc 后面的任何文本,并且如果之前的任何内容根本不包含 # 则从该点开始匹配。