2013-10-18 17 views
2

我需要從JavaScript代碼中查找和替換變量。JavaScript RegExp沒有給出預期的結果

可以說,我需要尋找「長」在給定的代碼,我要排除「x.length」或「線路長度」

樣品輸入 - 使它更容易調試

var sampleStringWhichWorks = 'function checkLength(l, ls){\n' + 
    'var line, lines, len, length01, linelength11;\n' + 
    'line = l;\n' + 
    'lines = ls;\n' + 
    'len = line.length12;\n' + 
    'length02 = lines.length13;\n' + 
    'if(len==length03){\n' + 
     'len--;\n' + 
     'length04= length05 + 1;\n' + 
     '}\n' + 
    'linelength14 = len + length06;\n' + 
    'return linelength15;\n' + 
'}\n'; 

這個/([^az.])length[d]{2}([^az])/mig表達式解決了這個問題,但對於像「length04 = length05 + 1」這樣的行,它只捕獲第一個長度,忽略第二個長度。

它適用於「length04 = length05 + 1」並捕獲兩個實例。

我已經添加[\ d] {2}只是爲了更好地理解,這裏預期的成果是捕獲所有的「長度」以0結束,而忽略與1

結束我試過,如指定其他選項,如[^ az] {0,1},但沒有解決問題。

檢查jsFiddle here

實際輸入和正則表達式(/([^az.])length([^az])/mig)從此

  1. 變種線

    function checkLength(l, ls){ 
        var line, lines, len, length, lineLength; 
        line = l; 
        lines = ls; 
        len = line.length; 
        length = lines.length; 
        if(len == length){ 
         len--; 
         length=length+1; 
        } 
        lineLength = len + length; 
        return lineLength; 
    } 
    

    預期結果,線條,LEN ,長度,lineLength;

  2. 長度 = lines.length;
  3. 如果(LEN == 長度){
  4. 長度 = 長度 + 1;
  5. lineLength = len + length;
+0

您還可以使用http://www.cyber-reality.com/regexy.html快速測試正則表達式 –

+0

我要告訴你,我不讀這不是因爲我不不想幫忙,但因爲有三十行中有十種不同的文字樣式。讓我頭疼,對不起。 – Ben

+0

@Steve - 採取,編輯 –

回答

2

如果你想匹配length當且僅當它不是由[a-z.]前面,而不是由[a-z]成功,那麼你可以使用這個:

/(^|[^a-z.])length(?![a-z])/mig 

說明:

(^|[^a-z.]) # Match either the start of the line or a char other than [a-z.] 
length  # Match "length0" 
(?![a-z]) # Assert that there is no [a-z] following the current match 

請注意,正則表達式將必須捕獲length之前的字符,如果th除了字符串的開始之外,其他任何地方都會發生匹配。這是不可避免的,因爲JavaScript可悲地缺乏對向後看斷言的支持。所以你需要檢查你的比賽的長度,並且如果長度是7,就砍掉第一個字符。

+0

行爲代碼將不會有length01或長度11,我已經添加,使他們更容易計數,並解釋我的問題 –

+0

@AjayBhosale :這個答案*是*使用前瞻斷言。你試過了嗎? –

+0

是的,它的工作原理是不玩索引。我現在將這個標記爲已接受的答案... –

2

,你必須是正則表達式匹配開始在前面的比賽結束,當你可以在此示例中看到的問題:

([^a-z.])length[\d]{2}([^a-z]) 

Regular expression visualization

Debuggex Demo

length05是沒有被捕獲,因爲=之前它已經被前一場比賽拿走了......

所以,你可以使用這個answer指示的方法:

var regex = /([^a-z.])length[\d]{2}([^a-z])/mig 

var matches = [], found; 
while (found = regex.exec(string)) { 
    matches.push(found[0]); 
    regex.lastIndex = found.index+1; 
} 

console.log(matches); 

你可以看到它的行動在這個小提琴:http://jsfiddle.net/x6ARj/3/


編輯:

針對您的評論,如果你想替換字符串,一種解決方案是使用slice方法使用found.indexregex.lastIndex項指標:

var replacement = "name", 
    regex = /([^a-z.])length([\d]{2}[^a-z])/mi, 
    matches = [], found; 

while (found = regex.exec(string)) { 
    string = string.slice(0, found.index) + found[1] + replacement + found[2] + string.slice(regex.lastIndex); 
    regex.lastIndex = found.index+1; 
} 

console.log(string); 
+0

+1,非常好,非常感謝,我還認爲=被前面的比賽抓住了,我現在需要考慮如何用它來取代它...我使用'$ 1SOME-OTHER-NAMKE-INSTEAD-OF-LENGTH $ 2' –

+0

您的意思是一個動態名稱,如下所示:'var name =「some_name」,regex = new RegExp(「([^ az。])」 + name +「[\\ d] {2}([^ az])」,「mig」);'。 –

+0

是的,我想用「some_other_name」替換「some_name」,同時保留捕獲的部分,所以我正在做code.replace(正則表達式,'$ 1some_other_name $ 2')來替換「some_name」與「some_other_name」 –

相關問題