java - Java 正则表达式问题(负前瞻和后瞻)
问题描述
我需要你们的帮助!这是一个棘手的 Java 正则表达式问题,已经搜索了几个小时的解决方案......这里是:
在下面的文字中,我想匹配“船”字......
- 如果就在它之前,则包括“一堆”。
- 如果紧随其后,则包括“螺旋桨”。
- 或者如果前面有“for a”,即使中间有“bunch of”,也不匹配。
- 或者如果后面有“预告片”,即使中间有“螺旋桨”也不匹配。
我有一条船要卖。它带有额外的船用螺旋桨,但没有船用拖车(船很大,所以您可能也需要船用螺旋桨拖车)。我曾经有很多船,但我对船的热情随着时间的推移而消退。我不认为人们会对一堆船感兴趣,但这是我的最后一艘船,所以 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 中,
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
- 一个完整的词boat
或boats
(?:\s+propellers?)?+
- 可选出现 1+ 个空格,后跟propeller
orpropellers
。注意:?+
所有格量词是这里的关键,以使下一个前瞻仅在此组模式之后执行。(?!\s+trailers?\b)
- 如果在当前位置的右侧有 1+ 个空格,然后是整个单词,则匹配trailer
失败trailers
。
推荐阅读
- sql - 从 bigquery 中的未嵌套行创建一个数组
- go - 如何在循环中使用 gorutines 来填充结构?
- reactjs - 如何在 Ant Design 的 Icon 中添加 href?
- c++ - 哪个更好地在类中的&成员函数中声明变量
- gitlab - GitLAB Dedicate Runner 无法联系 pull docker 镜像
- postgresql - 如何使用使用多个数据库的 postgres docker 容器在 init 上为特定数据库运行 *.sql 脚本?
- pandas - 如何将外部数据传递给 Pyomo 约束规则
- javascript - Movie API:如何返回值?
- python - 如何使用 python 连接可从本地计算机中的远程桌面访问的 oracle 数据库?
- python-3.x - TensorFlow ImportError:导入_pywrap_tensorflow_internal时DLL加载失败:找不到指定的模块