2016-07-25 32 views
3

我有一個字符串,我想用'|'將它拆分成數組,字符,但不 '\ |':在.split()函數中使用捕獲組

var a = 'abc\&|\|cba'; 
var b = a.split(/([^\\])\|/); 

結果:

b = ["abc", "&", "|cba"] 

預期輸出:

b = ["abc\&", "\|cba"] 

我基本上不能使用捕獲組在.split()函數正常。

+3

只是爲了澄清:你有' var a ='abc \\&| \\ | cba';'(='abc \&| \ | cba')或者真的'var a ='abc \&| \ | cba';'(='abc& | cba')?另外,你不需要一個捕獲組,你需要向後看,但是由於它在JS正則表達式中缺少,所以你需要匹配你需要的字符串。 –

+0

嘗試['b = a.match(/(?:[^ \\ | | | \\。)+/g)'](https://jsfiddle.net/r97opth9/) –

+0

如果您需要將用「|」提取詞你有意只需要以''「abc \&」,「cba」]'這樣的字母開頭的分詞嗎?否則你的數組將根據你的字符串變量進行拆分a - >'[「abc \&」,「\」,「cba」]' –

回答

1

您可以使用積極的向前分裂。

隨着逃脫反斜槓

var a = 'abc\\&|\\|cba'; 
 
var b = a.split(/\|(?=\\)/); 
 
console.log(b);

沒有逃脫反斜槓

/\|(?=\|)/

  • 0123斷言,下面的正則表達式可以匹配

    • \|字符|字面上

基本上它會查找匹配 -字符|字面上

  • (?=\|)正向前查找匹配一根管道,如果有其他管道在跟隨,則會分裂。

    var a = 'abc\&|\|cba'; 
     
    var b = a.split(/\|(?=\|)/); 
     
    console.log(b);

  • +1

    我不認爲這是OP的需求(與非逃生管道分開) –

    +0

    這正是我想要的。你能解釋你的第二個解決方案嗎? @Nina Scholz –

    0

    使用正則表達式的表達式,存儲在一個陣列中的每個識別的詞(在這種情況下的價格),然後在需要時抓住它可以按如下方式做到這一點

    var re = /(?:^|[ ])|([a-zA-Z]+)/gm; 
    var str = 'abc\&|\|cba'; 
    var identifiedWords; 
    
    while ((identifiedWords = re.exec(str)) != null) 
    { 
        if (identifiedWords.index === re.lastIndex) 
        { 
         re.lastIndex++; 
        } 
    // View your result using the "identifiedWords" variable. 
    // eg identifiedWords[0] = abc\& 
    // identifiedWords[1] = cba 
    

    }

    0

    我假設你的字符串中有一個文字\,並且你的問題包含一個t他輸入字符串文字。在JS C字符串中,您需要使用雙重\來定義文字反斜槓(因爲在常規字符串文字中,您可以定義轉義序列,如\r,\n等)。

    你的正則表達式需要匹配比\|或任何文字\後面加上任意字母以外的所有字符。如果你的字符串可以等於字面\,你需要

    var a = 'abc\\&|\\|cba'; 
     
    b = a.match(/(?:[^\\|]|\\.?)+/g); 
     
    console.log(b);

    的模式匹配:

    • (?: - (非捕獲交替組開始)
      • [^\\|] - 除之外的任何字符和|
      • | - 或
      • \\.? - 一個\後面加上任意1或0個字符,但換行符
    • )+ - 1次或多次
    +0

    但我實際上只有一次逃跑而不是雙重逃跑。我害怕不能這樣做? :( –

    +0

    不,這是不可能的,因爲你要麼他們作爲文字符號,要麼你沒有。 –