簡體   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