2014-10-17 48 views
0

我做了一個字符串(PCRE)搜索,但我不想匹配的評論或出現在註釋塊中的任何字符串,因此,在這個文件中:PCRE:搜索未評論的字符串或註釋塊內的字符串?

/* 
    function someFuncInCommentBlock(){ 
     return 'match this string'; 
    } 
*/ 
// var someVarThatsCommented = 'match this string'; 
var someVar = 'match this string'; 

function someFunc(){ 
    return 'match this string'; 
} 

...我只希望看到兩個匹配match this string(最後兩個不在評論中)。我需要什麼樣的模式語法來做到這一點?

+0

@vks:_「我只希望看到兩場比賽的'符合此string'(最後兩個不在評論) 「_ – Sam 2014-10-17 20:00:00

+1

這樣的東西呢:'return'/ *匹配這個字符串* /';' – 2014-10-17 20:10:23

回答

3

你可以使用這個表達式:

/\*[\s\S]*?\*/(*SKIP)(*FAIL)|//.*(*SKIP)(*FAIL)|'(.*?)' 

Working demo

enter image description here

這個表達式的想法是匹配你不想和使用標誌(*SKIP)(*FAIL)丟棄的東西。使用這種技術通常稱爲「丟棄術」您使用的是要排除這樣的模式鏈條如下:

/\*[\s\S]*?\*/(*SKIP)(*FAIL)  <--- Discard everything block comments 
|        or 
//.*(*SKIP)(*FAIL)    <--- Discard everything single comments 
|        or 
'(.*?)'       <--- Keep everything withing single quotes 

在PCRE正則表達式的情況下,你可以使用(*SKIP)(*FAIL)優勢說排除一切匹配此模式

在另一方面,正則表達式引擎不使用正則表達式的技巧,包括以下或模式的支持,這些標誌也可以達到同樣丟棄的技術:

exclude this | another pattern to exclude | (save this content) 

對於我張貼的正則表達式,如果你要達到相同的其他正則表達式引擎,你可以使用這個表達式:

/\*[\s\S]*?\*/|//.*|'(.*?)' 

所有要排除的模式是在左邊,它們是由手術室隔開。最重要的是,你有一個能夠匹配你想要的捕獲組。一個簡單的方法,看看這是在使用debuggex圖:

Regular expression visualization

由於Bark Kiers在此評論指出,我正則表達式匹配單引號內的內容,也不會明確匹配match this string。因此,爲了配合match this string你可以改變正則表達式:

/\*[\s\S]*?\*/(*SKIP)(*FAIL)|//.*(*SKIP)(*FAIL)|match this string 
+0

呃,我剛剛發佈我的辛勤工作 - #exactlythesame。 – Sam 2014-10-17 20:08:07

+1

好的答案!然而,如果OP正在尋找'匹配這個字符串'而不是字符串文字,那麼這將不適用於輸入'return'/ *匹配這個字符串* /';' – 2014-10-17 20:12:51

+0

嗨@BartKiers,你是對的,不要知道我的理解,OP要單引號內的字符串大聲笑。我會解決答案 – 2014-10-17 20:25:05