正则表达式自定义匹配标签并获取其组?
Regex custom matched tag ang get its group?
我正在尝试创建自定义标记。这个标记看起来像这样;如果没有属性那么它将是 <mark text mark>
并且这个匹配的组将是文本。如果这个标记有一个属性 <mark:attribute text mark>
就会像这样。在 <mark
之后会有一个没有 space 的冒号,并且会有一个没有 space 的属性。此次匹配会形成两组,第一组是冒号后的属性值,第二组是文本。
例子
<mark text mark>
必须匹配
<mark:attribute text mark>
必须匹配
<mark
text
mark>
必须匹配
<mark:attribute
text
mark>
必须匹配
<marktextmark>
不应该匹配
<mark>
不应该匹配
<mark:attributetextmark>
不应该匹配
<mark:attribute textmark>
不应该匹配
<mark: text mark>
不应该匹配
<mark:red ...blah...blah... mark>
必须匹配。第一组是 red,第二组是 ...blah...blah...
<mark Lorem Ipsum mark>
必须匹配。该组是 Lorem Ipsum
我认为当 mark 大写时会使匹配变得困难 <MARK TEXT MARK>
。不影响情况也无所谓
总结
- 必须以
<mark
开头
- 如果有属性,应该用冒号写,不用space。
<mark:attribute
- 必须以
mark>
结尾
- 正文前后应有space。
<mark:attribute text mark>
<mark text mark>
- 必须只有一组没有属性
<mark text mark>
组:文本
- 必须有两个属性为
<mark:attribute text mark>
的群组[0]:属性,群组[1]:文本
- 冒号后不能有space,所以属性值不能为空。
- 以及多线支持。
我尝试编写一些正则表达式 (<mark:([^*].+?)mark>
) 但我无法得到任何结果。我希望我能够解释。 https://regex101.com/r/jNsM88/1
感谢您的帮助。
第 0 组始终是 整个 匹配项,因此捕获的组从 1 开始:您的目标将被捕获到第 1 组和第 2 组(而不是您想要的 0 和 1)。
为属性使用可选(即量词?
)非捕获组((?:...)
)并捕获非空白\S
:
<mark(?::(\S+))?\s+(\S+)\s+mark>
我正在尝试创建自定义标记。这个标记看起来像这样;如果没有属性那么它将是 <mark text mark>
并且这个匹配的组将是文本。如果这个标记有一个属性 <mark:attribute text mark>
就会像这样。在 <mark
之后会有一个没有 space 的冒号,并且会有一个没有 space 的属性。此次匹配会形成两组,第一组是冒号后的属性值,第二组是文本。
例子
<mark text mark>
必须匹配<mark:attribute text mark>
必须匹配
<mark
text
mark>
必须匹配
<mark:attribute
text
mark>
必须匹配
<marktextmark>
不应该匹配<mark>
不应该匹配<mark:attributetextmark>
不应该匹配<mark:attribute textmark>
不应该匹配<mark: text mark>
不应该匹配
<mark:red ...blah...blah... mark>
必须匹配。第一组是 red,第二组是 ...blah...blah...<mark Lorem Ipsum mark>
必须匹配。该组是 Lorem Ipsum
我认为当 mark 大写时会使匹配变得困难 <MARK TEXT MARK>
。不影响情况也无所谓
总结
- 必须以
<mark
开头
- 如果有属性,应该用冒号写,不用space。
<mark:attribute
- 必须以
mark>
结尾
- 正文前后应有space。
<mark:attribute text mark>
<mark text mark>
- 必须只有一组没有属性
<mark text mark>
组:文本 - 必须有两个属性为
<mark:attribute text mark>
的群组[0]:属性,群组[1]:文本 - 冒号后不能有space,所以属性值不能为空。
- 以及多线支持。
我尝试编写一些正则表达式 (<mark:([^*].+?)mark>
) 但我无法得到任何结果。我希望我能够解释。 https://regex101.com/r/jNsM88/1
感谢您的帮助。
第 0 组始终是 整个 匹配项,因此捕获的组从 1 开始:您的目标将被捕获到第 1 组和第 2 组(而不是您想要的 0 和 1)。
为属性使用可选(即量词?
)非捕获组((?:...)
)并捕获非空白\S
:
<mark(?::(\S+))?\s+(\S+)\s+mark>