正则表达式否定前瞻无法成功排除多个字符

问题描述 投票:0回答:1

有以下5个示例,而我尝试查找3、4、5,而排除1,2。

  1. ABC-abc
  2. abc-ABC
  3. ABC-ABC
  4. ABC
  5. vABC-ABC-ABCv

我使用的当前表达式是:

(?!(\w*[A-Z]{2,}-[a-z]+\w*|\w*[a-z]+-[A-Z]{2,}\w*))(\w*-?[A-Z]{2,}-?\w*)
  • 我利用(\ w *-?[A-Z] {2,}-?\ w *)首先获得所有示例的所有可能性。
  • 然后我使用(?!... | ...)设置两个排除条件。
  • 第一个排除条件为\ w * [A-Z] {2,}-[a-z] + \ w *,第二个为\ w * [a-z] +-[A-Z] {2,} \ w *。
  • 此表达式可排除1.ABC-abc,但不排除abc-ABC。

我进行了很多搜索,发现有些人说这种方式不是regex擅长的。我有什么解决方案或改进措施可以摆脱abc-ABC。

感谢任何帮助或意见。

regex regex-lookarounds
1个回答
0
投票

据我所知,如果字符串中包含连字符,且连字符开头是小写字母,再后面是大写字母,则该字符串将被拒绝;反之亦然;否则他们将被接受。如果是这样,则可以使用以下正则表达式。

^(?!.*(?:[a-z]-[A-Z]|[A-Z]-[a-z]))

Demo

正则表达式引擎执行以下操作。

^                # match beginning of line
(?!              # begin a negative lookahead
  .*             # match 0+ characters
  (?:            # begin a non-capture group
    [a-z]-[A-Z]  # match a lc letter, '-', uc letter
    |            # or
    [A-Z]-[a-z]  # match an uc letter, '-', lc letter
  )              # end non-capture group
)                # end negative lookahead
© www.soinside.com 2019 - 2024. All rights reserved.