1

我正在寻找一个正则表达式,它将匹配由 [] 封装的下划线分隔的 2 个字符串的组合。每个实例都必须匹配,除非两个字符串都是完全大写的单词。

到目前为止我得到的是:

\[(([A-z](?=[a-z]+))(?!=[a-z]{0,}))[a-zA-Z]+_(([A-z](?![a-z]+))(?!=[a-z]{0,}))[a-zA-Z]+\]

它应该匹配除以下情况之外的所有情况:

[ONLYCAPS_ONLYCAPSTOO]

提前致谢!

忘了提一下:字符串还可以包含特殊字符和空白字符。

4

3 回答 3

2

你应该这样做

(?!\[[A-Z]+_[A-Z]+\])\[[^_]+_[^_]+\]
--------------------- --------------
         |                   |->desired result
         |
         |->won't match further if there's [ONLYCAPS_ONLYCAPSTOO] ahead

(?!pattern)是一个零宽度的前瞻..即它只会检查但不匹配!

[^_]会匹配任何东西,除了_

于 2013-10-11T11:09:16.583 回答
2

在这种情况下,您需要使用负前瞻。以下正则表达式将起作用:

\[(?![A-Z]+_[A-Z]+\])[a-zA-Z]+_[a-zA-Z]+\]

分手:

\[           # Start with '['
   (?!         # See if not followed by
      [A-Z]+     # Upper case letters one or more times
       _         # An underscore
      [A-Z]+     # Upper case letters one or more times
      \]         # Till the ending ']'
   )           # Negative look-ahead ends
   # If negative look-ahead succeeds, perform actual match.
   [a-zA-Z]+   # Match upper or lowercase alphabets one or more times
    _          # An underscore
   [a-zA-Z]+   # Match upper or lowercase alphabets one or more times
\]           # Ending ']'
于 2013-10-11T11:09:25.603 回答
0

您可以尝试使用负前瞻的正则表达式(如果您的正则表达式工具支持环视):

(?!^\[[A-Z]+_[A-Z]+\]$)\[(([A-z](?=[a-z]+))(?!=[a-z]{0,}))[a-zA-Z]+_(([A-z](?![a-z]+))(?!=[a-z]{0,}))[a-zA-Z]+\]
于 2013-10-11T11:07:02.213 回答