[英]Regex for nested values
我想要一個可以解析而忽略嵌套匹配的正則表達式
我的意思是例如:
/*asdasdasd /* asdasdsa */ qweqweqwe */
使第一個“ / *”與最后一個“ * /”匹配,而不是停止到第一個“ * /”
謝謝...
RegEx表達式自然很貪婪,因此您可以使用:
\/\*.*\*\/
如果您想讓它做您擔心的事情並使RegEx變得懶惰並在首場比賽后停止,則必須添加一個?
喜歡:
\/\*.*?\*\/
正則表達式無法按定義計算嵌套項目(盡管實現的確比計算機科學定義更重要)。
參見http://en.wikipedia.org/wiki/Regular_expression#Expressive_power_and_compactness
如果文本只有一個嵌套的注釋,那么到目前為止提出的解決方案都可以。 但是,正如LHMathies指出的那樣,如果文本中有多個注釋,而您想在它們之間保留某些內容,則這些解決方案將失敗。 例如,以下是一些測試數據以驗證算法是否正常工作:
/* one */
Stuff one
/* two /* three */ two */
Stuff two
/* four */
正確的解決方案將保留其中包含內容的兩行。 為了在Javascript中正確處理這種情況,您需要一個與最里面的注釋匹配的正則表達式(這是最困難的部分),然后重復應用此正則表達式,直到所有注釋都消失為止。 這是一個經過測試的函數,可以精確地做到這一點:
function strip_nested_C_comments(text)
{ // Regex to match innermost "C" style comment.
var re = /\/\*[^*\/]*(?:(?!\/\*|\*\/)[*\/][^*\/]*)*\*\//i;
// Iterate stripping comments from inside out.
while (text.search(re) != -1) {
text = text.replace(re, '');
}
return text;
}
編輯:改進了不匹配情況下的正則表達式效率。 (即,將“特殊”從[\\S\\s]
更改為[*\\/]
)。
正則表達式不善於處理嵌套值,因為您所描述的不是“ 正則語言 ”
但是正則表達式自然是貪婪的。 這意味着*和+量詞在默認情況下將完全滿足您的要求
var data = "/*asdasdasd /* asdasdsa */ qweqweqwe */";
data = data.replace( /\/\*.*\*\//, '' );
alert( 'Data: ' + data );
我猜測您確實在尋找可以刪除或處理字符串中正確嵌套的注釋的東西,即使有不止一個-給出“貪婪”正則表達式的答案也會從第一個/*
到最后一個*/
:在諸如keep /* comment */ keep /* comment */ keep
類的字符串中,它們會將中間的keep
視為注釋的一部分。
簡短的答案是Javascript RegExps不夠強大,您需要遞歸模式。 (也就是regexp不能計數 )。
但是,如果只想刪除注釋,則可以使用循環並首先刪除最里面的注釋(使用@mVChr中的非貪婪RegExp,並對其進行修改以匹配最后一個可能的起始定界符而不是第一個)。
var re = /(.*)\/\*.*?\*\//; while (re.test(string)) string.replace(re, '$1')
可以這么說,這將(嵌套級別的)計數移出正則表達式並進入循環。 (我沒有在正則表達式上放置g
標志,因為我不確定在循環中的兩個位置使用這樣的正則表達式時會產生副作用。循環會照常查找所有出現的事件)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.