2015-03-19 65 views
1

我工作的一個正則表達式必須只引號內而不是在註釋文本匹配,我macthes只能在大膽支架內的正則表達式匹配的正則表達式的報價

< 「愛」的字符串 ;>

>/* 「愛」 */<

<>'愛' <>

「LO

更多的愛

已經」

我stunck這個:

/(?:((\"|\')(.|\n)*?(\"|\')))(?=(?:\/\**\*\/))/gm 

第一個(?:((\"|\')(.|\n)*?(\"|\')))匹配所有的字符串 ,引號裏的第二個(?=(?:\/\**\*\/))不匹配文本/* "mystring" */

一下我的邏輯裏是克利錯誤

什麼建議嗎?

感謝

+0

您能告訴我一個ie嗎? – Morticella 2015-03-19 12:44:53

回答

0

避免評論部分的方法是在之前匹配它們。全球格局是這樣的:

/(capture parts to avoid)|target/ 

然後使用一個回調函數,用於替換(當拍攝組存在,返回比賽沒有改變,否則,你想要的東西更換比賽

例。 :

var result = text.replace(/(\/\*[^*]*(?:\*+(?!\/)[^*]*)*\*\/)|"[^"\\]*(?:\\[\s\S][^"\\]*)*"|'[^'\\]*(?:\\[\s\S][^'\\]*)*'/g, 
    function (m, g1) { 
     if (g1) return g1; 
     return '<b>' + m + '</b>'; 
}); 
+0

非常感謝正則表達式的完美,並且我更瞭解正則表達式的邏輯。再次感謝 – Morticella 2015-03-19 12:54:11

+0

@Morticella:單引號沒有問題,刷新頁面。 – 2015-03-19 13:06:40

+0

是的你是對的完美 – Morticella 2015-03-19 13:12:12

2

也許你只需要使用負前瞻檢查註釋結束*/

但首先,我會分割字符串分成幾行

var arrayOfLines = input_str.split(/\r?\n/); 

,或者不空行:

var arrayOfLines = input_str.match(/[^\r\n]+/g); 

然後用this regex

["']([^'"]+)["'](?!.*\*\/)

示例代碼:

var rebuilt_string = '' 
var re = /["']([^'"]+)["'](?!.*\*\/)/g; 
var subst = '<b>$1</b>'; 

for (i = 0; i < arrayOfLines.length; i++) 
{ 
    rebuilt_string = rebuilt_string + arrayOfLines[i].replace(re, subst) + "\r\n"; 
} 
+0

'(「|')([^''] +)(」|')(?!\ * \ /(。我改變了一點正則表達式,但它仍然匹配註釋中的字符串 – Morticella 2015-03-19 12:43:27

+0

我寧願先分割多行輸入,然後應用'['']([^' 「] +)[''](?!。* \ * \ /)'正則表達式。但是,您已經從C&H得到了一個適合您的答案 – 2015-03-19 13:36:27