我正在为 Sublime/TextMate 语言文件中的某些语法高亮处理正则表达式,它要求我在非自结束 html 标记上“开始”,并在相应的结束标记上结束:
开始:
(<)([a-zA-Z0-9:.]+)[^/>]*(>)
结尾:
(</)(\2)([^>]*>)
到目前为止,一切顺利,我能够捕获标签名称,并且它匹配能够为标签之间的区域应用适当的模式。
jsx-tag-area:
begin: (<)([a-zA-Z0-9:.]+)[^/>]*>
beginCaptures:
'1': {name: punctuation.definition.tag.begin.jsx}
'2': {name: entity.name.tag.jsx}
end: (</)(\2)([^>]*>)
endCaptures:
'1': {name: punctuation.definition.tag.begin.jsx}
'2': {name: entity.name.tag.jsx}
'3': {name: punctuation.definition.tag.end.jsx}
name: jsx.tag-area.jsx
patterns:
- {include: '#jsx'}
- {include: '#jsx-evaluated-code'}
现在,我还希望能够在开始标记中捕获零个或多个 html 属性,以便能够突出显示它们。
所以如果标签是<div attr="Something" data-attr="test" data-foo>
它将能够匹配attr
, data-attr
, and data-foo
, 以及 the <
anddiv
类似的东西(这很粗糙):
(<)([a-zA-Z0-9:.]+)(?:\s(?:([0-9a-zA-Z_-]*=?))\s?)*)[^/>]*(>)
它不需要完美,它只是为了一些语法突出显示,但我很难弄清楚如何在标签中实现多个捕获组,我是否应该使用环视等,或者这是否是甚至可以用一个表达式。
编辑:这里有关于具体案例/问题的更多细节 - https://github.com/reactjs/sublime-react/issues/18