2015-09-17 77 views
2

「/ *」[^ * /] * 「* /」爲什麼這個評論正則表達式錯了?

它相匹配的第一/ *然後它等待除* /任何字符,然後當它得到的* /它會匹配整個正則表達式,用於鑽例如此評論:

/*布魯諾/布拉加*/

有人能告訴我爲什麼/不匹配? 謝謝。

+1

恕我直言,你忘了'*'是一個特殊字符,必須轉義以匹配文字。嘗試使用'/ \ *(?:(?!\ */|/\ *)[\ s \ S])* \ * /',或者更簡單'/ \ * [\ s \ S] *?\ */'。如果您在評論中沒有換行符號,請嘗試使用'/\*.*?\/''。 –

+0

如果有任何正則表達式適合您,請讓我知道。 –

回答

0

爲什麼這個評論正則表達式錯了?

這是由於與正則表達式的幾個問題:

  1. 所有不必要的報價"裏面
  2. 當你開始一個字符類的否定標誌:[^]它在它否定了一切,在你的例子中,它會消除空間,因爲你已經包含了它。此外,字符/存在於輸入字符串的中間,你可能想要禁止它,只有當它在*後面的「結束評論「 - */
  3. 作爲stribizhev已在上述評論中提到 - *是一個特殊字符,應該逃脫。這同樣適用於/
  4. 存在於正則表達式/*之後的空間(輸入字符串/*bruno...不包含這樣的一個空間)
  5. 最後一顆星星和斜線封閉註釋之間的空間:* /

總結以上各點,正則表達式應更正爲:

\/\*[^\*]*\*\/ 

DEMO


在路易斯的評論跟進:如果你想允許裏面的評論*符號,你可以使用:

\/\*(.*?)\*\/ 

DEMO

+0

@LuisColorado是真的,但沒有這樣的要求。如果OP認爲一個'*'符號很可能是評論的一部分 - 這個要求應該加入到這個問題:) – alfasin

+0

但是這應該是他希望得到一個正確的答案,而不是再次處理這個問題看到包含'*'使整個匹配字符串無效。即使它沒有被指定爲這樣,C語言註釋允許在裏面放入'*'字符。 –

+0

該編輯將使其接受'/ * bla bla *// * bla bla * /'作爲整體評論,而不是兩個評論之間有空格。看看我的解決方案,因爲我也回答了這個問題。 –

0

正確的正則表達式匹配評論(允許除*/序列之外的所有內容,必須先允許除**之外的任何字符,然後是除之外的任何字符,所以

/\*([^\*]|\*[^/])*\*/ 

Demonstration

應該做的工作(記住,在示範正則表達式的分隔符/所以他們用反斜槓逃脫,也許你將不得不做,在你的代碼逃脫。