所以我有这个Regular expression ,它基本上必须将给定的字符串过滤为 HTML(5) 格式 属性列表。目前它并没有让我感到满足,但这种情况即将改变! (希望如此)
我试图实现这一目标:每当找到一个匹配项时,它就会选择文本,直到下一个匹配项或字符串末尾,作为第二个匹配项。因此,如果您查看当前的正则表达式:
/([a-zA-Z]+|[a-zA-Z]+-[a-zA-Z0-9]+)=["']/g
像这样的字符串:hey="hey world"hey-heyhhhhh3123="Hello world"data-goed="hey"
将像这样过滤/匹配:
MATCH 1. [0-3] `hey`
MATCH 2. [16-32] `hey-heyhhhhh3123`
MATCH 3. [47-56] `data-goed`
这必须被视为属性名称,现在......我们只需获取属性的值。所以提到的字符串必须有这样的结果:
MATCH 1.
1 [0-3] `hey`
2 [6-14] `hey world`
MATCH 2.
1 [16-32] `hey-heyhhhhh3123`
2 [35-45] `Hello world`
MATCH 3.
1 [47-56] `data-goed`
2 [59-61] `hey`
有人可以尝试帮助我获得满足吗?将会非常感激!
最佳答案
你可以使用
/([^\s=]+)=(?:"([^"\\]*(?:\\.[^"\\]*)*)"|(\S+))/g
图案详细信息:
([^\s=]+)
- 第 1 组捕获除空格和=
符号之外的 1 个或多个字符=
- 等号(?:"([^"\\]*(?:\\.[^"\\]*)*)"|(\S+))
- 非捕获一组 2 个替代方案(可以添加另一个'([^'\\]*(?:\\.[^'\\]*)*)'
替代方案以考虑单引号字符串文字)"([^"\\]*(?:\\.[^"\\]*)*)"
- 双引号字符串文字模式:"
- 双引号([^"\\]*(?:\\.[^"\\]*)*)
- 第 2 组捕获除\
之外的 0 个以上字符> 和"
,后跟任何转义符号的 0+ 序列,后跟除\
和"
之外的 0+ 字符
"
- 结束双引号
|
- 或(\S+)
- 第 3 组捕获一个或多个非空白字符
JS 演示(不支持单引号):
var re = /([^\s=]+)=(?:"([^"\\]*(?:\\.[^"\\]*)*)"|(\S+))/g;
var str = 'hey="hey world" hey-heyhhhhh3123="Hello \\"world\\"" data-goed="hey" more=here';
var res = [];
while ((m = re.exec(str)) !== null) {
if (m[3]) {
res.push([m[1], m[3]]);
} else {
res.push([m[1], m[2]]);
}
}
console.log(res);
JS 演示(支持单引号文字)
var re = /([^\s=]+)=(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|(\S+))/g;
var str = 'pseudoprefix-before=\'hey1"\' data-hey="hey\'hey" more=data and="more \\"here\\""';
var res = [];
while ((m = re.exec(str)) !== null) {
if (m[2]) {
res.push([m[1], m[2]])
} else if (m[3]) {
res.push([m[1], m[3]])
} else if (m[4]) {
res.push([m[1], m[4]])
}
}
console.log(res);
关于javascript - 正则表达式 - 忽略引号/HTML(5) 属性过滤之间的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39208444/