繁体   English   中英

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

[英]Java regex issue (negative lookahead & lookbehind)

我需要你们的帮助,伙计们。 这是一个棘手的 java 正则表达式问题。 几个小时以来一直在寻找解决方案。:. 这里是:

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

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

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

以下部分应匹配:

  • (“船”)
  • 一堆船(“船”前面是“一堆”)
  • 船螺旋桨(“船后跟“螺旋桨”)

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

  • 为船(“船”前面有“为”)
  • 船拖车(“船后跟”拖车“)
  • 对于一堆船(“船”前面是“一堆”,前面是“for a”)
  • 船螺旋桨拖车(“船”后跟“螺旋桨”,后跟“拖车”)

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM