簡體   English   中英

使用JS匹配簡單的正則表達式模式(鍵:值)

[英]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:”
  • 后面沒有空格
  • 后跟單引號或雙引號
  • 捕獲所有直到..
  • 下一個單引號或雙引號

/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM