Java 正则表达式问题(否定前瞻和后视)

Java regex issue (negative lookahead & lookbehind)

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

在下面的文字中,我要匹配"boat"这个词...

  1. 如果放在 "bunch of " 之前,则包括 "bunch of "。
  2. 并包括“propeller”(如果紧跟其后)。
  3. 或者如果前面有 "for a " 则不匹配,即使中间有 "bunch of "。
  4. 如果后跟“trailer”则不匹配,即使中间有 "propeller "。

I have a boat to sell. It comes with extra boat propellers but does not come with a boat trailer (the boat is pretty big so you might need a boat propeller trailer too). I used to have a bunch of boats but my passion for a boat faded with time. I did not think people would have interest for a bunch of boats but this is my last one, so Yeéé! :)

以下部分应匹配:

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

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

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

希望有人能提供帮助:-)

您可以在 Java 中使用以下具有 constrained-width 后视模式(支持限制量词)的正则表达式:

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

参见Java regex demo online (proof)

在Java,

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

正则表达式详细信息

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