首页 > 解决方案 > Java 正则表达式:需要零个/偶数个反斜杠,而不包括匹配中的反斜杠

问题描述

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

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

(?<!\\)(?:\\{2})*(<@!|<@)[0-9]+>

问题是匹配项包含反斜杠,我需要一个包含反斜杠的正则表达式。

任何人都可以制作一个可以做到这一点的正则表达式吗?

例子:

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

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

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

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

标签: javaregex

解决方案


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

(<@!|<@)您的模式中的部分匹配<@!或匹配<@,差异仅在!字符中。因此,将其替换为<@!?匹配的简单模式<@然后是可选!字符是合乎逻辑的。然后,捕获整个(<@!?\d+>部分,并使用 Java 代码获取它。

请参阅Java 演示

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); 
        } 
    }
}

输出:

<@!1123>
<@3123>
<@3456>

推荐阅读