2013-08-20 62 views
2

我正在嘗試創建一個正則表達式來捕獲重複字符之間的文本。我只想在3個重複字符之間捕捉文本,但我不想在4個或更多字符之間匹配文本。正則表達式捕獲3但不是4重複字符的文本

例子:

==Text not to capture== 
===Text to capture=== 
====Text not to capture==== 
=====Text not to capture===== 

這正則表達式將捕捉那些具有3 ===多:

(?<=[=]{3})(.*?)(?=[=]{3}) 

如何排除那些有4個或更多字符?

回答

3

您可以向您的代碼添加負面的代碼,以確保您捕捉的零件之前/之後沒有其他=

(?<=(?<![=])[=]{3})(?![=])(.*?)(?<![=])(?=[=]{3}(?![=])) 

如果你想看到細分:

第一向後看,確保您的代碼是由===之前。裏面的負面後視確保之前沒有另一個=。然後前瞻確保它不會被另一個=跟隨。

(?<=(?<![=])[=]{3})(?![=]) 

捕捉到一些東西,它可以包括=字符:

(.*?) 

然後確保你有===,再次嵌套環視,以確保沒有其他=在外面,以及一個單獨的(小的)環視,以確保內部沒有另一個。

(?<![=])(?=[=]{3}(?![=])) 
+0

差不多,但它仍然捕捉'=東西= ''裏面'====東西===='。添加更多的環視。 –

+0

修正了這個問題,記住它看起來很糟糕,我很確定它不是固定的。仍在考慮改進。 – Michelle

+0

這個爲我工作。它只捕獲===並且捕獲組需要文本。謝謝! – BlueNile

1

你可以利用這一點,並採取捕獲組:

(?<!=)={3}([^=]+)={3}(?!=) 

,或者如果你想允許=內:

(?<!=)={3}((?>[^=]+|=(?!==(?:[^=]|$)))+)={3}(?!=) 
+0

不錯。米歇爾的解決方案OTOH能夠在'=== key = value ==='中捕獲'key = value'。 –

+0

@JanDvorak:現在我可以捕獲'key ==== value''key = value' –