2017-05-04 73 views
2

使用JavaScript的正則表達式,我想找到像"/foo""/foo d/"但不"/foo /";即「註釋字符」,然後是沒有終止註釋的單詞或多個單詞,其中終止出現在短語的末尾(沒有空格)。使情況複雜化,有三種可能的註釋符號:/,\|如何否定一個捕獲組?

我已經試過類似:

/(?:^|\s)([\\\/|])((?:[\w_-]+(?![^\1]+[\w_-]\1))|(?:[\w\s]+[\w](?=\1)))/g 

也就是說,先從空間,然後註釋,然後

  1. 字後面沒有(除了註釋),那麼文字和註解.. 。或
  2. 可能是多個單詞,緊接着是註釋字符。

問題是[^\1]:這不讀爲尖括號中的「除註釋字符之外的任何內容」。

我可以重複整個短語三次,每個註釋字符一個。任何更好的想法?

+1

順便說一下,'\ w'已經包含'_'。 – 2017-05-04 05:03:24

+0

而不是'[^ \ 1] +',嘗試'。+?',以非貪婪地匹配到下一個註釋字符。 – 2017-05-04 05:04:21

回答

2

正如你所提到的,[^\1]不起作用 - 它匹配任何不是字符1。在JavaScript中,您可以通過使用前瞻來取消\1(?:(?!\1).)*。這不是有效的,但它的工作原理。

你的模式可以寫成:

([\\\/|])([\w\-]+(?:(?:(?!\1).)*[\w\-]\1)?) 

Working example at Regex101

  • \w已經包含下劃線。
  • 而不是更改(a|ab)我使用一個可選組(a(?:b)?) - 我們總是匹配第一個單詞,並帶有可選的其他單詞和標籤。
  • 您可能還想在開始處包含(?:^|\s)