将多个条件应用于捕获组

Apply multiple conditions to a capturing group

我需要从文本中提取所有符合这两个要求的词:

  1. 至少包含一个大写字母
  2. 不完全由大写字符组成。

所以,WordWordD 是正确的捕获,但是 wordWORD 不是。

所以,我可以使用 \b([a-zA-Z]+)\b 正则表达式捕获所有单词,但我不知道如何在此处添加大写字母条件。

关于要求 #1,我 tried 在这里使用积极的前瞻:

\b(?=.*[A-Z]+)([a-zA-Z]+)\b ,但现在如果该行至少有一个大写字母,它会捕获该行中的所有单词。

甚至可以对捕获组应用附加条件吗? 我可以在我的应用程序代码中处理它,但我真的更愿意在一个正则表达式中满足所有这些要求。

您可以使用

\b(?=[A-Z]*[a-z])(?=[a-z]*[A-Z])([a-zA-Z]+)\b

regex demo

实际上,您甚至不需要捕获组,([a-zA-Z]+) 通常可以用 [a-zA-Z]+ 代替,但这取决于您使用正则表达式的位置。

详情

  • \b - 单词边界
  • (?=[A-Z]*[a-z]) - 一个积极的前瞻,需要在 0+ 个大写字母之后有一个小写字母
  • (?=[a-z]*[A-Z]) - 一个积极的前瞻,需要在 0+ 个小写字母之后有一个大写字母
  • ([a-zA-Z]+) - 第 1 组:1 个或多个字母
  • \b - 单词边界。