我正在为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
, 和 data-foo
, 以及 <
和 div
类似于(这只是初步的):
(<)([a-zA-Z0-9:.]+)(?:\s(?:([0-9a-zA-Z_-]*=?))\s?)*)[^/>]*(>)
它不必非常完美,只是为了一些语法高亮而已,但我很难弄清如何在标签内实现多个捕获组,是否应该使用环视等,或者这是否可以通过单个表达式实现。编辑:下面是有关特定情况/问题的更多详细信息 - https://github.com/reactjs/sublime-react/issues/18
"include": "$self"
进行递归匹配,这非常可爱。它也可以用于特定的组吗?例如:匹配<[Tag][All Attributes]>
...</[Tag]>
,然后使用另一条规则解析[All Attributes]
吗? - Kobi