2011-05-04 31 views
10

我想在Javascript中使用正則表達式替換一些字符串。該場景是一個單行字符串,其中包含長逗號分隔的數字列表,其中可能有重複。Javascript正則表達式不捕獲前綴

一個例子字符串是:272,2725,2726,272,2727,297,272(端部可以或不可以在逗號結束)

在本例中,我試圖整個號碼272的每次出現(3個匹配預期) 的匹配我試圖使用的示例正則表達式是:(?:^|,)272(?=$|,)

我遇到的問題是第二個和第三個匹配包括前導逗號,我不想要。我很困惑,因爲我認爲(?:^|,)會匹配,但不會捕獲。有人能爲我闡明這一點嗎?有趣的是,結果中排除了後面的逗號,這正是我想要的。

如果我使用的是C#,前綴匹配的語法就是我想要的:(?<=^|,) 但是,它似乎在JavaScript中不受支持。

最後,我知道我可以解決它使用字符串拆分,數組操作和重新加入,但我想學習。

+1

你說得對,JavaScript不支持逆序。 – 2011-05-04 15:19:06

回答

15

使用word boundaries代替:

\b272\b 

確保只有272比賽,但不是2725

(?:...)匹配並不捕獲 - 但無論匹配什麼,都將成爲整體匹配的一部分。

A lookaround assertion(?=...)不同:它只檢查是否可能(或不可能)在當前點匹配所包含的正則表達式,但它不會添加到整體匹配中。

+0

感謝您的快速回復。我認爲這將工作..我會嘗試它,並回來標記爲答案。此外,您對分組行爲的評論特別有用。再次感謝。 – 2011-05-04 15:53:12

+0

終於到了驗證,這確實工作。再次感謝Tim。我忽略了\ b包含集合[0-9]而不是[a-z] [A-Z]的事實。我現在也對分組行爲有了更好的理解。 – 2011-05-04 18:05:22

2

這是一種創建JavaScript背後的方法,它在我需要的所有情況下都能正常工作。

這是一個例子。人們可以做許多更復雜和更靈活的事情。

這裏的要點是在某些情況下, 有可能在JavaScript中創建RegExp非捕獲前綴 (look behind)構造。

本示例旨在提取所有由大括號'{...}'包圍的字段。 大括號不與該字段一起返回。

這只是一個例子,表明工作中的想法不一定是應用程序的前奏。

function testGetSingleRepeatedCharacterInBraces() 
     { 
     var leadingHtmlSpaces = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' ; 
     // The '(?:\b|\B(?={))' acts as a prefix non-capturing group. 
     // That is, this works (?:\b|\B(?=WhateverYouLike)) 
     var regex = /(?:\b|\B(?={))(([0-9a-zA-Z_])\2{4})(?=})/g ; 
     var string = '' ; 

     string = 'Message has no fields' ; 
     document.write('String => "' + string 
             + '"<br>' + leadingHtmlSpaces + 'fields => ' 
             + getMatchingFields(string, regex) 
             + '<br>') ; 

     string = '{LLLLL}Message {11111}{22222} {ffffff}abc def{EEEEE} {_____} {4444} {666666} {55555}' ; 
     document.write('String => "' + string 
             + '"<br>' + leadingHtmlSpaces + 'fields => ' 
             + getMatchingFields(string, regex) 
             + '<br>') ; 
     } ; 

    function getMatchingFields(stringToSearch, regex) 
     { 
     var matches = stringToSearch.match(regex) ; 
     return matches ? matches : [] ; 
     } ; 

    Output: 
    String => "Message has no fields" 
     fields => 
    String => "{LLLLL}Message {11111}{22222} {ffffff}abc def{EEEEE} {_____} {4444} {666666} {55555}" 
     fields => LLLLL,11111,22222,EEEEE,_____,55555 
+2

這不是在做你認爲它做的事。 '\ B(?= {)'選項聲明下一個字符是'{',但該字符必須匹配'[0-9a-zA-Z_]'來滿足其餘的正則表達式。你的'(?:\ b | \ B(?= {))'可能只是'\ b',因爲第二個選擇將永遠不會參與匹配。 – 2012-12-12 00:04:49