Java 正则表达式问题(否定前瞻和后视)
Java regex issue (negative lookahead & lookbehind)
我需要你们的帮助!!这是一个棘手的 java 正则表达式问题,已经搜索了几个小时的解决方案...这里是:
在下面的文字中,我要匹配"boat"这个词...
- 如果放在 "bunch of " 之前,则包括 "bunch of "。
- 并包括“propeller”(如果紧跟其后)。
- 或者如果前面有 "for a " 则不匹配,即使中间有 "bunch of "。
- 如果后跟“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éé! :)
以下部分应匹配:
- 船 ("boat")
- 一堆船("boat"前面有"bunch of ")
- 船用螺旋桨 ("boat followed by "螺旋桨")
以下部分不应匹配(甚至部分匹配):
- 一条船("boat"前面有"for a ")
- 拖车("boat followed by "拖车")
- 一堆船("boat"前面有"bunch of "后面有"for a ")
- boat propeller trailer("boat"后跟“propeller”后跟“trailer”)
我在正则表达式 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
- 一个完整的单词 boat
或 boats
(?:\s+propellers?)?+
- 可选出现 1+ 个空格,后跟 propeller
或 propellers
。 注意:?+
所有格量词是使下一个先行仅在此组模式之后执行的关键。
(?!\s+trailers?\b)
- 如果在当前位置的右侧有 1+ 个空格,然后 trailer
或 trailers
作为整个单词。
我需要你们的帮助!!这是一个棘手的 java 正则表达式问题,已经搜索了几个小时的解决方案...这里是:
在下面的文字中,我要匹配"boat"这个词...
- 如果放在 "bunch of " 之前,则包括 "bunch of "。
- 并包括“propeller”(如果紧跟其后)。
- 或者如果前面有 "for a " 则不匹配,即使中间有 "bunch of "。
- 如果后跟“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éé! :)
以下部分应匹配:
- 船 ("boat")
- 一堆船("boat"前面有"bunch of ")
- 船用螺旋桨 ("boat followed by "螺旋桨")
以下部分不应匹配(甚至部分匹配):
- 一条船("boat"前面有"for a ")
- 拖车("boat followed by "拖车")
- 一堆船("boat"前面有"bunch of "后面有"for a ")
- boat propeller trailer("boat"后跟“propeller”后跟“trailer”)
我在正则表达式 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
- 一个完整的单词boat
或boats
(?:\s+propellers?)?+
- 可选出现 1+ 个空格,后跟propeller
或propellers
。 注意:?+
所有格量词是使下一个先行仅在此组模式之后执行的关键。(?!\s+trailers?\b)
- 如果在当前位置的右侧有 1+ 个空格,然后trailer
或trailers
作为整个单词。