首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java :需要零/偶数反斜杠,而不包括匹配中的反斜杠

Java :需要零/偶数反斜杠,而不包括匹配中的反斜杠
EN

Stack Overflow用户
提问于 2021-07-01 18:43:02
回答 1查看 68关注 0票数 2

我需要一个正则表达式来匹配所有被<@所包围的数字!或<@ and >。匹配不能跟随奇数反斜杠,但可以跟随零或偶数反斜杠。

目前,我有一个正则表达式:

代码语言:javascript
运行
复制
(?<!\\)(?:\\{2})*(<@!|<@)[0-9]+>

问题是,匹配的包含,反斜杠,我需要一个正则表达式来执行,而不是,包括反斜杠。

有人能做一个正则表达式来完成这个任务吗?

示例:

有效输入字符串:\\<@!123>

匹配:<@!123>

无效输入字符串:\\\<@!123>

匹配:无

有效输入字符串:<@123>test<@456>

匹配:<@123>, <@456>

无效输入字符串:\<@123>test\\\<@456>

匹配:无

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-01 20:13:20

您可以使用(?<!\\)(?:\\\\)*(<@!?\d+>)正则表达式捕获所需的子字符串。见regex演示

模式中的(<@!|<@)部分与<@!<@匹配,区别仅在!字符中。因此,用一个简单的<@!?模式来替换它是合乎逻辑的,这个模式可以匹配<@,然后是一个可选的!字符。然后,捕获整个(<@!?\d+>部分,并使用Java代码获取它。

Java演示

代码语言:javascript
运行
复制
import java.util.*;
import java.util.stream.*;
import java.util.regex.*;
 
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String s = "1) \\\\<@!1123> 2) \\\\\\<@!2123> 3) <@3123>test<@3456> 4) \\<@4123>test\\\\\\<@4456>";
        Pattern pattern = Pattern.compile("(?<!\\\\)(?:\\\\\\\\)*(<@!?\\d+>)");
        for (String t: pattern.matcher(s).results().flatMap(g -> Stream.of(g.group(1))).toArray(String[]::new)) {
            System.out.println(t); 
        } 
    }
}

输出:

代码语言:javascript
运行
复制
<@!1123>
<@3123>
<@3456>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68215436

复制
相关文章

相似问题

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