javascript - 正则表达式 - 忽略引号/HTML(5) 属性过滤之间的文本

标签 javascript regex filter attributes expression

所以我有这个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

参见regex demo

图案详细信息:

  • ([^\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/

相关文章:

regex - 捕获匹配组的子字符串

python - 如何使用python正则表达式计算文本中特殊字符后面的单词的出现次数

python - 正则表达式 match() 无法捕获 python 中的简单模式

python - Haystack SearchQuerySet 不会过滤具有一个字符的 CharField (Whoosh/django-haystack)

javascript - 使用 Prototype 的 Class.create 定义私有(private)/ protected 属性和方法

javascript - 将类属性添加到常规函数

r - 过滤每组中间行

javascript - Angularjs 从字符串开始搜索

javascript - 如何使用 Bootstrap 实现从一种模式到另一种模式的导航?

javascript - 单击按钮时如何获得播放音频的图像按钮?