我如何编写一个从后面开始阅读的正则表达式?

How do i write a RegEx that starts reading from behind?

我有一系列的词要捕捉。

我遇到以下问题:

示例(粗体是我试图捕获的):

这是我到目前为止尝试过的 RegEx,它只在“非捕获”字符串不包含任何大写单词的情况下有效: /(?:[a-zäöü]*)([\p{L} +().&]+[Cars|Hard])/gu

大写字母使用\p{Lu}:

(?:[\p{Lu}+()&][\p{L}+()&]* )+(?:Cars|Hard)

参见 live demo(显示匹配的变音字母和 ß)。

您可以以大写字符开始匹配,也允许德语大写字符,然后可以选择重复匹配以大写字符或“特殊字符”开头的单词。

然后以匹配 Hard 或 Cars 的交替结束比赛。

(?<!\S)[A-ZÄÖÜß][a-zA-ZäöüßÄÖÜẞ]*(?:\s+(?:[A-ZÄÖÜß][a-zA-ZäöüßÄÖÜẞ]*|[+()&]))*\s+(?:Hard|Cars)\b

说明

  • (?<!\S) 断言左侧的空白边界以防止在非空白字符之后开始匹配
  • [A-ZÄÖÜß][a-zA-ZäöüßÄÖÜẞ]* 匹配以大写字符开头的单词
  • (?: 非捕获组作为整体匹配
    • \s+ 匹配 1+ 个空白字符
    • (?:非捕获组
      • [A-ZÄÖÜß][a-zA-ZäöüßÄÖÜẞ]* 匹配以大写开头的单词
      • |
      • [+()&] 匹配“特殊”字符之一
    • )关闭非捕获组
  • )* 关闭非捕获组并选择性重复
  • \s+ 匹配 1+ 个空白字符
  • (?:Hard|Cars) 匹配其中一个选项
  • \b 防止部分单词匹配的单词边界

看到一个regex demo