簡體   English   中英

Javascript reg exp不對

[英]Javascript reg exp not right

這是一個字符串str = '.js("aaa").js("bbb").js("ccc")' ,我想寫一個正則表達式來返回一個這樣的數組:

[aaa, bbb, ccc];

我的正則表達式是:

var jsReg = /.js\(['"](.*)['"]\)/g;
var jsAssets = [];
var js;
while ((js = jsReg.exec(find)) !== null) {
    jsAssets.push(js[1]);
}

但是jsAssets的結果是

[""aaa").js("bbb").js("ccc""]

這個正則表達式出了什么問題?

使用.*的懶惰版本:

/\.js\(['"](.*?)['"]\)/g
              ^

如果你逃離第一個點會更好。

這將匹配最少數量的字符,直到下一個引用。

jsfiddle演示

如果您想允許轉義引號,請使用以下內容:

/\.js\(['"]((?:\\['"]|[^"])+)['"]\)/g

regex101演示

我相信它可以通過replace and match方法調用在單行中完成:

var str = '.js("aaa").js("bbb").js("ccc")';

str.replace(/[^(]*\("([^"]*)"\)[^(]*/g, '$1,').match(/[^,]+/g);
//=> ["aaa", "bbb", "ccc"]

/.js\(['"](.*)['"]\)/g

盡可能匹配,並且不捕獲組1,因此它匹配

"aaa").js("bbb").js("ccc"

但是給出了你的例子輸入。

嘗試

/\.js\(('(?:[^\\']|\\.)*'|"(?:[\\"]|\\.)*"))\)/

打破這個,

  1. \\. 匹配文字點
  2. \\.js\\(匹配文字字符串“.js(”
  3. (開始捕捉字符串。
  4. [^\\\\']|\\\\. 匹配除引號或反斜杠之外的字符或轉義的非行終止符。
  5. (?:[\\\\']|\\\\.)*匹配字符串的主體
  6. '(?:[\\\\']|\\\\.)*'匹配單引號字符串
  7. (...|...)捕獲單引號或雙引號字符串
  8. )\\)關閉捕獲組並匹配文字的右括號

第二個主要問題是你的循環。

你正在反復進行一場全球比賽,沒有任何意義。

擺脫g修飾符,然后事情應該更好。

問題是你正在使用.* 這將匹配任何角色。 您必須更加具體地了解您要捕獲的內容。

如果它只是單詞字符,你可以使用\\w匹配任何單詞字符。 這包括[a-zA-Z0-9_] :大寫,小寫,數字和下划線。

所以你的正則表達式看起來像這樣:

var jsReg = /js\(['"](\w*)['"]\)/g;

試試這個 - http://jsfiddle.net/UDYAq/

var str = new String('.js("aaa").js("bbb").js("ccc")');

var regex = /\.js\(\"(.*?)\"\){1,}/gi;
var result = [];

result = str.match (regex);

for (i in result) {
    result[i] = result[i].match(/\"(.*?)\"/i)[1];
}

console.log (result);

要確保匹配的字符被相同的引號括起來:

/\.js\((['"])(.*?)\1\)/g

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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