[英]Match simple regex pattern using JS (key: value)
我有一個簡單的場景,我想匹配以下內容並捕獲值:
stuff_in_string,
env: 'local', // want to match this and capture the content in quotes
more_stuff_in_string
我以前從未寫過正則表達式模式,因此請原諒,我很清楚這是完全錯誤的。
這就是我要說的:
/env:*?\\s+('|")+(.*?)+('|")/g
謝謝
PS這里是#失敗的小提琴: http : //jsfiddle.net/DfHge/
注意:這是我最終使用的正則表達式(不是下面的答案,因為它對我的需求來說是過大的): /env:\\s+(?:"|')(\\w+)(?:"|')/
env *('|").*?\\1
是您要尋找的
*
表示沒有或更多
('|")
匹配單引號或雙引號, 也將其保存到組中以進行反向引用
.*?
是一個勉強的貪婪的比賽
\\1
將引用第一組,即單引號或雙引號
您可以使用此:
/\benv: (["'])([^"']*)\1/g
其中\\1
是對第一個捕獲組的反向引用,因此您的內容在第二個捕獲組中。 這是簡單案例的簡單方法。
現在,其他情況如下:
env: "abc\"def"
env: "abc\\"
env: "abc\\\def"
env: "abc'def"
您必須使用更嚴格的模式:
第一:避免不同報價問題:
/\benv: (["'])((?:[^"']+|(?!\1)["'])*)\1/g
我將所有可能的內容都放入了一個我可以隨意重復的非捕獲組中,並且我使用了一個負號(?!\\1)
來檢查允許的引用是否與捕獲的引用不同。
第二:反斜杠問題:
如果引號被轉義,則不能作為結尾引號! 因此,您必須檢查引號是否轉義,並在字符串中允許轉義的引號。
我從允許的內容中刪除了反斜杠:
/\benv: (["'])((?:[^"'\\]+|(?!\1)["'])*)\1/g
我允許轉義字符:
/\benv: (["'])((?:[^"'\\]+|(?!\1)["']|\\[\s\S])*)\1/g
要在加引號的部分之前留有可變數量的空格,可以將:
替換為:\\s*
/\benv:\s*(["'])((?:[^"'\\]+|(?!\1)["']|\\[\s\S])*)\1/g
您現在有了工作模式。
第三:模式優化
一個簡單的替換:
使用捕獲組和反向引用可以引誘不同類型的引號,因為它允許以簡明的方式編寫模式。 但是,這種方法需要創建一個捕獲組並測試該部分的前瞻性(?!\\1)
[“']`,因此效率不高。編寫簡單的替換會增加模式長度,並且需要使用兩個捕獲這兩種情況下的組,但效率更高:
/\benv:\s*(?:"((?:[^"\\]+|\\[\s\S])*)"|'((?:[^'\\]+|\\[\s\S])*)')/g
(注意:如果您決定這樣做,則必須檢查是否定義了兩個捕獲組之一。)
展開循環:
為了匹配引號內的內容,我們使用(?:[^"\\\\]+|\\\\[\\s\\S])*
(此處為雙引號)有效,但可以進行改進以減少所需的步驟。為此,我們將展開循環以避免循環:
[^"\\]*(?:\\[\s\S][^"\\]*)*
最后,整個模式可以這樣寫:
/\benv:\s*(?:"([^"\\]*(?:\\[\s\S][^"\\]*)*)"|'([^'\\]*(?:\\[\s\S][^'\\]*)*)')/g
regex=/env: ?['"]([^'"])+['"]/
answer=str.match(regex)[1]
甚至更好:
regex=/env: ?(['"])([^\1]*)\1/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.