【发布时间】:2020-07-29 16:32:23
【问题描述】:
我正在尝试使用正则表达式为我正在制作的自定义降价“语言”在 Java 中制作某种 Lexer,这是我第一次使用这些东西,所以在一些事情上有点迷失。
其中一个可能的语法示例是:Some <#000000>*text* [<#ffffff>Some more](action: Other <#gradient>text) and **finally** some more <#000>text!
我能够捕捉到一些东西,例如我使用(?<hex><#\w+>) 来捕捉“十六进制”和(?<action>\[[^]]*]\([^]]*\)) 来获取整个“动作”块。
我的问题是能够将它们全部捕获在一起,例如如何将它们组合在一起。例如,词法分析器需要输出如下内容:
TEXT - Some
HEX - <#000000>
TEXT - *text*
ACTION - [<#ffffff>Some more](action: Other <#gradient>text)
TEXT - and **finally** some more
HEX - <#000>
TEXT - text!
我稍后会处理粗体和斜体。
想要一些关于如何结合所有这些的建议!
【问题讨论】:
-
您可以为所有部分创建(命名)捕获组
^(.*?) (?<hex1><#\w+>)(\*[^*]*\*) (?<action>\[[^]]*]\([^]]*\)) (.*?) (?<hex2><#\w+>)(.*)$regex101.com/r/iocBCR/1 -
@Thefourthbird 嘿,谢谢!很难,这意味着它需要与我发送的示例完全相同?例如更改顺序或添加新标签将无法识别。
-
当前模式取决于按该顺序出现的所有部分。您可以使用交替使其更灵活
(?<hex><#\w+>)|(?<action>\[[^]]*]\([^]]*\))|(?<text>[\w!* ]+)regex101.com/r/JWHNP9/1 -
@Thefourthbird 哦,好的,我现在开始明白了,谢谢!如果您想将其发布为答案。