2

我有这样格式的字符串。abcd我想匹配开头没有的字符串。

abcd.efgh.ijkl
pqrs.efgh.ijkl
xyz.efgh.ijkl

我想出了这个表达(?<!abcd).efgh.ijkl http://rubular.com/r/jyZMIJxoNz

它有点做我需要的。它匹配 and 的.efgh.ijkl部分pqrs.efgh.ijkl并且xyz.efgh.ijkl忽略abcd.efgh.ijkl。但我也希望它与pqrsxyz部分相匹配。

我尝试制作这样的条件,(?(?<!abcd)|.*\.efgh.ijkl)但它甚至没有被识别为正则表达式。语法有什么问题?它不是说“如果它以 abcd 开头,那么blank其他所有内容都匹配到.efgh.ijkl?

4

5 回答 5

2
[^\s]*(?<!abcd).efgh.ijkl

http://rubular.com/r/h11pUhuYSD

应该为您的目的工作。如果目标位于更长的字符串中,它甚至匹配。

于 2012-04-24T12:33:13.827 回答
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 似乎不支持它们。不过没关系,反正那是行不通的。

于 2012-04-24T16:12:17.187 回答
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) «$»
-->
于 2012-04-24T10:21:20.460 回答
0

试试这个:

[^"(a.+b)|(b.+c)|(c.+d)|"].* 

http://rubular.com/r/51OShSXwUz

于 2012-04-24T10:39:33.747 回答
0

负面的lookbehinds很有趣,它们是一个很好的工具。

但是,如果您只想匹配不以 开头的整行abcd,一个简单的方法是匹配以开头的行然后获取每行匹配的行。abcd

示例(蟒蛇):

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,而不是其他正则表达式),那么字符串操作将更快更容易理解:

In [5]: for line in lines:
   ...:     if not(line.startswith('abcd')):
   ...:         print(line)
   ...: 

pqrs 3
pqrs 4
于 2012-04-24T11:03:49.040 回答