2014-11-23 56 views
2

我對正則表達式很陌生,並且我在網上找到的解決方案都沒有幫助/工作。顛倒一套相當複雜的正則表達式

我處理JavaScript中一行字符串,它會包含五種類型混合的數據。

  • A「#」後跟六個數字/字母(HTML顏色)(/#....../g
  • 正斜槓後跟任意幾個特定字符(/\/(\+|\^|\-|#|!\+|_|@|\*|%|&|~)/g
  • 「$」後跟一串字母和一個「|」 (/\$([^\|]+)/g
  • 「|」沒有在任何這些類別

的事情是落在單獨(/\|/g

  • 字母數字字符,我的正則表達式匹配前四個類別,是非常重要的。 問題是我需要一個正則表達式來替換前四個正則表達式與單個字符(例如「§」)不匹配的所有字符。

    例子:

    This#00CC00 is green$Courier| and /^mono|spaced

    §§§§#00CC00§§§§§§§§§$Courier|§§§§§/^§§§§|§§§§§§

    我知道我可能會攻擊這個問題的錯誤的方式,我是相當新的正則表達式。 本質上,我該如何製作一個正則表達式,意思是「任何與正則表達式x,y或z沒有任何匹配的東西」?

    謝謝你的時間。

  • +0

    因此,如果你的字符串是:' 「#1234567」'應該改爲:「 」#123456§「'? – ridgerunner 2014-11-23 01:36:36

    +0

    是的,我想知道與四個正則表達式不匹配的所有內容。測試正則表達式'/#......|\/(\+|\^|\||||!\+|_|@|\*||||||)|\$([[^) \ |] +)[||本站](http://www.regexr.com/)顯示了我的意思。我希望選中的所有內容都不被選中,反之亦然。 – 2014-11-23 01:58:54

    回答

    3

    使用這種模式

    ((#\w{6}|\/[\/\(\+\^\-]|\$\w+\||\|)*). 
    

    和替換W/$1§
    負面影響是你保存的模式,必須遵循由至少一個角色從Regex101

    複製
    Demo

    (     # Capturing Group (1) 
        (    # Capturing Group (2) 
        #    # "#" 
        \w    # <ASCII letter, digit or underscore> 
        {6}    # (repeated {6} times) 
        |    # OR 
        \/    # "/" 
        [\/\(\+\^\-] # Character Class [\/\(\+\^\-] 
        |    # OR 
        \$    # "$" 
        \w    # <ASCII letter, digit or underscore> 
        +    # (one or more)(greedy) 
        \|    # "|" 
        |    # OR 
        \|    # "|" 
    )     # End of Capturing Group (2) 
        *     # (zero or more)(greedy) 
    )     # End of Capturing Group (1) 
    .     # Any character except line break 
    

    代碼

    var re = /((#\w{6}|\/[\/\(\+\^\-]|\$\w+\||\|)*)./gm; 
    var str = 'This#00CC00 is green$Courier| and /^mono|spaced|\n'; 
    var subst = '$1§'; 
    var result = str.replace(re, subst); 
    
    +0

    正則表達式似乎適用於您提供的鏈接,是的。現在,這可能聽起來很愚蠢,但我如何使用JavaScript做出這樣的替換? – 2014-11-23 02:41:52

    +0

    不得不做一個小小的改動,以'/((##w{6}|\[[/\(\+\^\-]|\$.+\||\|)*)./gm '除此之外,像魅力一樣工作!謝謝! – 2014-11-23 03:39:07

    +0

    @BrunoPaschoalinoto,你可能想把它改成'/((#\ w {6} | \/[\/\(\ + \^\ - ] |) \ $。+?\ || \ |)*)./ gm',注意懶惰的運算符'?' – 2014-11-23 03:41:48

    1

    這不像工作正則表達式那樣有效,但它起作用。基本上它會得到所有的匹配,並填充§個字符之間的部分。一件好事是你不必成爲正規表達天才來更新它,所以希望更多的人可以使用它。

    var str = 'This#00CC00 is green$Courier| and /^mono|spaced'; 
    var patt=/#(\d|\w){6}|\/(\+|\^|\-|#|!\+|_|@|\*|%|&|~)|\$([^\|]+)\||\|/g; 
    var ret = ""; 
    
    pos = []; 
    while (match=patt.exec(str)) { 
        pos.push(match.index); 
        pos.push(patt.lastIndex); 
        console.log(match.index + ' ' + patt.lastIndex); 
    } 
    
    for (var i=0; i<pos.length; i+=2) { 
        ret += Array(1+pos[i]- (i==0 ? 0 : pos[i-1])).join("§"); 
        ret += str.substring(pos[i], pos[i+1]); 
    } 
    ret += Array(1+str.length-pos[pos.length-1]).join("§"); 
    
    document.body.innerHTML = str +"<br>"+ret; 
    
    console.log(str); 
    console.log(ret); 
    

    demo here