我有这样的格式的字符串。我希望匹配开头没有abcd
的字符串。
abcd.efgh.ijkl
pqrs.efgh.ijkl
xyz.efgh.ijkl
我想出了这个表达式(?<!abcd).efgh.ijkl
http://rubular.com/r/jyZMIJxoNz
它有点满足我的需要。它与.efgh.ijkl
和pqrs.efgh.ijkl
的{{1}}部分匹配,并忽略xyz.efgh.ijkl
。但我也希望它与abcd.efgh.ijkl
和pqrs
部分匹配。
我尝试像xyz
那样制作条件,但它甚至不被认为是正则表达式。语法有什么问题?是不是说“如果它以abcd开头,那么(?(?<!abcd)|.*\.efgh.ijkl)
或其他所有内容都匹配到blank
?
答案 0 :(得分:2)
答案 1 :(得分:1)
你想为此使用前瞻,而不是后视。
^(?!abcd\.)[a-z]+(?:\.[a-z]+)+$
主正则表达式是^[a-z]+(?:\.[a-z]+)+$
,它匹配由两个或多个由点分隔的字母组成的字符串。在开始锚之后的前瞻确保第一个丛不是abcd
。
请注意,如果它真的是Ruby,那么^
和$
是行锚点。这意味着正则表达式将从字符串中取出第二行:
foo
pqrs.efgh.ijkl
bar
......这可能不是你想要的。为了确保只匹配Ruby中的整个字符串,您应该使用字符串锚点\A
和\z
:
\A(?!abcd\.)[a-z]+(?:\.[a-z]+)+\z
至于你尝试使用条件,Ruby似乎不支持它们。但无所谓,无论如何都不会有效。
答案 2 :(得分:0)
试试这个:
(?m)^(?!abcd).+$
说明:
<!--
(?m)^(?!abcd).+$
Options: ^ and $ match at line breaks
Match the remainder of the regex with the options: ^ and $ match at line breaks (m) «(?m)»
Assert position at the beginning of a line (at beginning of the string or after a line break character) «^»
Assert that it is impossible to match the regex below starting at this position (negative lookahead) «(?!abcd)»
Match the characters “abcd” literally «abcd»
Match any single character that is not a line break character «.+»
Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
Assert position at the end of a line (at the end of the string or before a line break character) «$»
-->
答案 3 :(得分:0)
答案 4 :(得分:0)
负面的外观很有趣,它们是一个很好的工具。
但是,如果您只想匹配不以abcd
开头的整行,一个简单的方法是匹配执行的行从abcd
开始,然后选择不匹配的每一行。
示例(python):
In [1]: lines = [
...: "abcd 1",
...: "abcd 2",
...: "pqrs 3",
...: "pqrs 4" ]
In [2]: import re
In [4]: for line in lines:
...: if re.match(r"^abcd.+$", line):
...: pass # do nothing
...: else:
...: print (line)
...:
pqrs 3
pqrs 4
此外,如果您要查找的abcd
是文字字符串(即字面意思abcd
,而不是其他正则表达式),那么字符串操作将更快更容易理解:< / p>
In [5]: for line in lines:
...: if not(line.startswith('abcd')):
...: print(line)
...:
pqrs 3
pqrs 4