我编写了一个正则表达式来匹配一些看起来像这样的标签:
@("hello, world" bold italic font-size="15")
我希望正则表达式匹配这些字符串:['hello, world', 'bold', 'italic', 'font-size="15"']
。
但是,只匹配这些字符串:['hello, world', 'font-size="15"']
。
其他例子:
@("test") -> ["test"]
@("test" bold) -> ["test", "bold"]
@("test" bold size="15") -> ["test", "bold", 'size="15"']
我尝试过使用这个正则表达式:
\@\(\s*"((?:[^"\\]|\\.)*)"(?:\s+([A-Za-z0-9-_]+(?:\="(?:[^"\\]|\\.)*")?)*)\s*\)
细分版本:
\@\(
\s*
"((?:[^"\\]|\\.)*)"
(?:
\s+
(
[A-Za-z0-9-_]+
(?:
\=
"(?:[^"\\]|\\.)*"
)?
)
)*
\s*
\)
正则表达式正在尝试
$(
),=
符号)
)但是,此正则表达式仅匹配"hello, world"
和font-size="15"
。如何使其与bold
和italic
匹配,即多次匹配群组([A-Za-z0-9-_]+(?:\="(?:[^"\\]|\\.)*")?)
?
预期结果:['"hello, world"', 'bold', 'italic', 'font-size="15']
P.S。使用JavaScript本机正则表达式
答案 0 :(得分:2)
您需要一个两步解决方案:
@\((?:\s*(?:"[^"\\]*(?:\\.[^"\\]*)*"|[\w-]+(?:="?[^"\\]*(?:\\.[^"\\]*)*"?)?))+\s*\)
对匹配进行标记。示例代码:
var re = /@\((?:\s*(?:"[^"\\]*(?:\\.[^"\\]*)*"|[\w-]+(?:="?[^"\\]*(?:\\.[^"\\]*)*"?)?))+\s*\)/g;
var re2 = /(?:"([^"\\]*(?:\\.[^"\\]*)*)"|[\w-]+(?:="?[^"\\]*(?:\\.[^"\\]*)*"?)?)/g;
var str = 'Text here @("hello, world" bold italic font-size="15") and here\nText there @("Welcome home" italic font-size="2345") and there';
var res = [];
while ((m = re.exec(str)) !== null) {
tmp = [];
while((n = re2.exec(m[0])) !== null) {
if (n[1]) {
tmp.push(n[1]);
} else {
tmp.push(n[0]);
}
}
res.push(tmp);
}
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";