首页 > 解决方案 > Java 正则表达式问题(负前瞻和后瞻)

问题描述

我需要你们的帮助!这是一个棘手的 Java 正则表达式问题,已经搜索了几个小时的解决方案......这里是:

在下面的文字中,我想匹配“船”字......

  1. 如果就在它之前,则包括“一堆”。
  2. 如果紧随其后,则包括“螺旋桨”。
  3. 或者如果前面有“for a”,即使中间有“bunch of”,也不匹配。
  4. 或者如果后面有“预告片”,即使中间有“螺旋桨”也不匹配。

我有一条船要卖。它带有额外的船用螺旋桨,但没有船用拖车(船很大,所以您可能也需要船用螺旋桨拖车)。我曾经有很多船,但我对船的热情随着时间的推移而消退。我不认为人们会对一堆船感兴趣,但这是我的最后一艘船,所以 Yeéé!:)

以下部分应匹配:

以下部分不应匹配(甚至部分不匹配):

我在正则表达式 101 ( https://regex101.com/r/o6S4SP/22 ) 中得到了这个示例设置,但它不能正常工作:-(

PS:我使用 Regex101 作为示例,但 Java 的正则表达式语法不支持“(SKIP)(FAIL)”。

希望任何人都可以提供帮助:-)

标签: javaregexkotlinregex-lookaroundsnegative-lookbehind

解决方案


您可以在 Java 中使用以下正则表达式,它具有宽度受限的后向模式(支持限制量词):

(?<!\bfor\sa\s(?:bunch\sof\s){0,1})(?:\bbunch\s+of\s+)?\bboats?\b(?:\s+propellers?)?+(?!\s+trailers?\b)

请参阅在线 Java 正则表达式演示(证明)

在 Java 中,

s = s.replaceAll("(?<!\\bfor\\sa\\s(?:bunch\\sof\\s){0,1})(?:\\bbunch\\s+of\\s+)?\\bboats?\\b(?:\\s+propellers?)?+(?!\\s+trailers?\\b)", "<b>$0</b>");

正则表达式详细信息

  • (?<!\bfor\sa\s(?:bunch\sof\s){0,1})- 如果在当前位置的左侧紧邻有
    • \bfor\sa\s- for, 空格, a, 空格
    • (?:bunch\sof\s){0,1}bunch- , whitespace, of, whitespace的 0 或 1 次出现(即可选出现)
  • (?:\bbunch\s+of\s+)?bunch- , 1+ 个空格, of, 1+ 个空格的可选出现
  • \bboats?\b- 一个完整的词boatboats
  • (?:\s+propellers?)?+- 可选出现 1+ 个空格,后跟propelleror propellers注意?+所有格量词是这里的关键,以使下一个前瞻仅在此组模式之后执行。
  • (?!\s+trailers?\b)- 如果在当前位置的右侧有 1+ 个空格,然后是整个单词,则匹配trailer失败trailers

推荐阅读