首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java和regex lexer

Java和regex lexer
EN

Stack Overflow用户
提问于 2020-07-29 16:32:23
回答 2查看 160关注 0票数 0

我试图在Java中使用regex来制作一种定制的标记“语言”,这是我第一次使用这些东西,所以在一些事情上有点迷失了。

其中一个可能的语法示例是:

Some <#000000>*text* [<#ffffff>Some more](action: Other <#gradient>text) and **finally** some more <#000>text!

我能够捕获一些东西,例如,我使用(?<hex><#\w+>)捕获“十六进制”,使用(?<action>\[[^]]*]\([^]]*\))获取整个"action“块。

我的问题是能把所有的东西都捕捉到一起,比如,如何把它们结合起来。例如,lexer需要输出如下内容:

代码语言:javascript
复制
TEXT - Some
HEX - <#000000>
TEXT - *text*
ACTION - [<#ffffff>Some more](action: Other <#gradient>text)
TEXT - and **finally** some more
HEX - <#000>
TEXT - text!

我稍后会处理粗体和斜体字。

希望能就如何将它们结合在一起提出一些建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-29 19:09:18

一个选项可以是使用与每个独立部分相匹配的替换,对于文本部分使用(例如字符类 [\w!* ]+ )。

在Java中,您可以检查捕获组的名称。

代码语言:javascript
复制
(?<hex><#\w+>)|(?<action>\[[^]]*]\([^]]*\))|(?<text>[\w!* ]+)

解释

  • (?<hex><#\w+>)捕获组hex、match #和1+ word chars
  • |
  • (?<action>捕获组action
    • \[[^]]*]\([^]]*\) Match [.]后面跟着(...)

  • )紧群
  • |
  • (?<text>[\w!* ]+)捕获组text,匹配字符类中列出的任何字符的1+次数。

Regex演示 x- Java演示

示例代码:

代码语言:javascript
复制
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"));  
    }
}

输出

代码语言:javascript
复制
TEXT - Some 
HEX - <#000000>
TEXT - *text* 
ACTION - [<#ffffff>Some more](action: Other <#gradient>text)
TEXT -  and **finally** some more 
HEX - <#000>
TEXT - text!
票数 2
EN

Stack Overflow用户

发布于 2020-07-29 17:38:15

您可以使用Regex捕获组(如这个^(.*?) (?<hex1><#\w+>)(\*[^*]*\*) (?<action>\[[^]]*]\([^]]*\)) (.*?) (?<hex2><#\w+>)(.*)$ )来更好地理解这个单击此处

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63158293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档