我试图在Java中使用regex来制作一种定制的标记“语言”,这是我第一次使用这些东西,所以在一些事情上有点迷失了。
其中一个可能的语法示例是:
Some <#000000>*text* [<#ffffff>Some more](action: Other <#gradient>text) and **finally** some more <#000>text!
我能够捕获一些东西,例如,我使用(?<hex><#\w+>)捕获“十六进制”,使用(?<action>\[[^]]*]\([^]]*\))获取整个"action“块。
我的问题是能把所有的东西都捕捉到一起,比如,如何把它们结合起来。例如,lexer需要输出如下内容:
TEXT - Some
HEX - <#000000>
TEXT - *text*
ACTION - [<#ffffff>Some more](action: Other <#gradient>text)
TEXT - and **finally** some more
HEX - <#000>
TEXT - text!我稍后会处理粗体和斜体字。
希望能就如何将它们结合在一起提出一些建议。
发布于 2020-07-29 19:09:18
一个选项可以是使用与每个独立部分相匹配的替换,对于文本部分使用(例如字符类 [\w!* ]+ )。
在Java中,您可以检查捕获组的名称。
(?<hex><#\w+>)|(?<action>\[[^]]*]\([^]]*\))|(?<text>[\w!* ]+)解释
(?<hex><#\w+>)捕获组hex、match #和1+ word chars|或(?<action>捕获组action \[[^]]*]\([^]]*\) Match [.]后面跟着(...))紧群|或(?<text>[\w!* ]+)捕获组text,匹配字符类中列出的任何字符的1+次数。示例代码:
String regex = "(?<hex><#\\w+>)|(?<action>\\[[^]]*]\\([^]]*\\))|(?<text>[\\w!* ]+)";
String string = "Some <#000000>*text* [<#ffffff>Some more](action: Other <#gradient>text) and **finally** some more <#000>text!";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
if (matcher.group("hex") != null) {
System.out.println("HEX - " + matcher.group("hex"));
}
if (matcher.group("text") != null) {
System.out.println("TEXT - " + matcher.group("text"));
}
if (matcher.group("action") != null) {
System.out.println("ACTION - " + matcher.group("action"));
}
}输出
TEXT - Some
HEX - <#000000>
TEXT - *text*
ACTION - [<#ffffff>Some more](action: Other <#gradient>text)
TEXT - and **finally** some more
HEX - <#000>
TEXT - text!发布于 2020-07-29 17:38:15
您可以使用Regex捕获组(如这个^(.*?) (?<hex1><#\w+>)(\*[^*]*\*) (?<action>\[[^]]*]\([^]]*\)) (.*?) (?<hex2><#\w+>)(.*)$ )来更好地理解这个单击此处。
https://stackoverflow.com/questions/63158293
复制相似问题