[英]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
^
如果你逃離第一個點會更好。
這將匹配最少數量的字符,直到下一個引用。
如果您想允許轉義引號,請使用以下內容:
/\.js\(['"]((?:\\['"]|[^"])+)['"]\)/g
我相信它可以通過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\(('(?:[^\\']|\\.)*'|"(?:[\\"]|\\.)*"))\)/
打破這個,
\\.
匹配文字點 \\.js\\(
匹配文字字符串“.js(” (
開始捕捉字符串。 [^\\\\']|\\\\.
匹配除引號或反斜杠之外的字符或轉義的非行終止符。 (?:[\\\\']|\\\\.)*
匹配字符串的主體 '(?:[\\\\']|\\\\.)*'
匹配單引號字符串 (...|...)
捕獲單引號或雙引號字符串 )\\)
關閉捕獲組並匹配文字的右括號 第二個主要問題是你的循環。
你正在反復進行一場全球比賽,沒有任何意義。
擺脫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.