javascript
  • regex
  • 2016-03-01 45 views 3 likes 
    3

    我花了一個多小時搞亂了正則表達式模式,以便在一個複雜的字符串上運行正確的find-and-replaceTricky正則表達式解析關鍵值對

    我需要一個字符串轉換是這樣的:

    foo a='b' c="d and e" wombat=true a fizz='buzz' "hello='goodbye'" 
    

    和規範它轉換成:

    foo "a='b'" "c='d and e'" "wombat='true'" a "fizz='buzz'" "hello='goodbye'" 
    

    本質:

    • key/value對應該被包裹在雙引號,用單引號括起來,不管它們是如何包裝的即

    • 爲了將「包含」爲一個值,多空格值必須先包裝在單引號或雙引號中。


    到目前爲止我用正則表達式玩的順序:

    str = str.replace(/([a-zA-Z0-9]*)=("(.*?)"|'(.*?)')/g, '"$1=\'$2\''); 
    

    然而,這有一噸的問題。

    是否有任何單一替代解決方案呢?

    +0

    爲什麼會'了''之後TRUE',前'fizz'不被認爲是'foo a ='b'c =「d和e」的值wombat = true a fizz ='buzz'「hello ='goodbye'」'? – guest271314

    +0

    @ guest271314「爲了將」包含「爲一個值,多空格值必須先用單引號或雙引號括起來。」 – dthree

    回答

    6

    /(['"]?)(\w+)=(?:(['"])((?:(?!\3).)*)\3|(\S+))\1/g 
    

    "$2='$4$5'" 
    

    給人的希望

    foo "a='b'" "c='d and e'" "wombat='true'" a "fizz='buzz'" "hello='goodbye'" 
    

    表達分解如下:

    (['"]?)   # group 1: either single or double quote, optional 
    (\w+)    # group 2: word characters (i.e. the "key") 
    =     # a literal "=" 
    (?:    # non-capturing group 
        (['"])   # group 3: either single or double quote 
        (    # group 4 (quoted value): 
        (?:(?!\3).)* #  any character that's not the same as group 3 
    )    # end group 4 
        \3    # the quote from group 3 
        |    # or... 
        (\S+)   # group 5 (non-quoted value, no spaces) 
    )     # end non-capturing group 
    \1     # whatever group 1 had, for good measure 
    
    +0

    你瘋了。 – dthree

    +3

    謝謝。 :)我也添加了表達式的細分。 – Tomalak

    +0

    @dree OBTW,請注意,如果您的值可以包含換行符,則需要將'.'更改爲'[\ s \ S]'。 – Tomalak

    1

    下面的正則表達式將滿足您的要求:

    "?(\w+)='?([\w]+)'?"?|"?(\w+)="([\w\s]+)""? 
    

    與替換爲:

    "$1$3='$2$4'" 
    

    Demo

    +0

    也是一個想法,但不考慮單引號中的間隔值。 [另一個想法](https://regex101.com/r/xX0cO2/1)。 –

    +0

    是的,沒有考慮到。但正則表達式可以很容易地修改。 – Rahul

    相關問題