亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

正則表達式以獲取Javascript中兩個字符串之間的字符串

正則表達式以獲取Javascript中兩個字符串之間的字符串

我發現了非常類似的帖子,但我在這里找不到我的正則表達式。我正在嘗試編寫一個正則表達式,它返回一個字符串,該字符串位于另外兩個字符串之間。例如:我想得到駐留在字符串“牛”和“牛奶”之間的字符串。我的??偸俏古D虝貋怼翱偸墙o予”到目前為止,我拼湊起來的表達方式如下:(?=cow).*(?=milk)不過,這會返回“??偸墙o”的字符串。正則表達式以獲取Javascript中兩個字符串之間的字符串
查看完整描述

3 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

正則表達式以獲取Javascript中兩個字符串之間的字符串

在絕大多數情況下,最完整的解決方案是使用捕獲組帶著懶惰點匹配模式..然而,一個點.在JS regex中,不匹配換行字符,所以,在100%情況下,[^][\s\S]/[\d\D]/[\w\W]構造。

ECMAScript 2018和新的兼容解決方案

在JS環境中支持ECMAScript 2018s修飾符允許.匹配任何字符,包括換行字符,regex引擎支持可變長度的查找。所以,您可以使用正則表達式,例如

var result = s.match(/(?<=cow\s+).*?(?=\s+milk)/gs); // Returns multiple matches if any// Orvar result = s.match(/(?<=cow\s*).
*?(?=\s*milk)/gs); // Same but whitespaces are optional

在這兩種情況下,都會檢查當前的位置。cow之后的任何1/0或更多的空白空間cow,則任何0+字符盡可能少地被匹配和消耗(=添加到匹配值),然后milk被選中(在此子字符串之前使用任何1/0或更多的空格)。

場景1:單行輸入

所有JS環境都支持此方案和以下所有其他方案。參見答案底部的用法示例。

cow (.*?) milk

cow首先找到一個空格,然后找到除換行字符以外的任何0+字符,盡可能少使用*?是一個惰性量詞,被捕獲到組1中,然后用milk必須跟隨(并且它們是匹配的,并且消耗掉)。

場景2:多行輸入

cow ([\s\S]*?) milk

這里,cow首先匹配一個空格,然后將任意0+字符盡可能少地匹配并捕獲到第1組,然后使用milk是匹配的。

場景3:重疊匹配

如果你有一個字符串>>>15 text>>>67 text2>>>你需要兩場比賽>>>+number+whitespace>>>,你不能用/>>>\d+\s(.*?)>>>/g因為這將只找到一個匹配的事實,因為>>>以前67已經消耗掉找到第一次匹配。您可以使用正前瞻檢查文本是否存在,而不實際“吞食”它(即附加到比賽中):

/>>>\d+\s(.*?)(?=>>>)/g

在線regex演示屈服text1text2作為第一組的內容。

亦見如何獲得字符串的所有可能的重疊匹配.

業績考慮

懶惰點匹配模式(.*?)如果給出很長的輸入,regex模式可能會減慢腳本的執行速度。在很多情況下,展開環技術在很大程度上是有幫助的。試圖抓住兩者之間的一切cowmilk從…"Their\ncow\ngives\nmore\nmilk",我們看到,我們只需要匹配所有的行,而不是從milk因此,而不是cow\n([\s\S]*?)\nmilk我們可以使用:

/cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm

regex演示(如果可以的話)\r\n,使用/cow\r?\n(.*(?:\r?\n(?!milk$).*)*)\r?\nmilk/gm)。使用這個小測試字符串,性能增益是可以忽略不計的,但是對于非常大的文本,您會感覺到差異(特別是如果行長,換行不多)。

JavaScript中的示例regex用法:

//Single/First match expected: use no global modifier and access match[1]

console.log("My cow always gives milk".match(/cow (.*?) milk/)[1]);

// Multiple matches: get multiple matches with a global modifier and 

// trim the results if length of leading/trailing delimiters is known

var s = "My cow always gives milk, thier cow also gives milk";

console.log(s.match(/cow (.*?) milk/g).map(function(x) {return x.substr(4,x.length-9);}));

//or use RegExp#exec inside a loop to collect all the Group 1 contents

var result = [], m, rx = /cow (.*?) milk/g;

while ((m=rx.exec(s)) !== null) {

  result.push(m[1]);

}

console.log(result);


查看完整回答
反對 回復 2019-06-09
  • 3 回答
  • 0 關注
  • 1429 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號