【问题标题】:Java Regex: Require zero/even amount of backslashes without including backslashes in the matchJava Regex:需要零个/偶数个反斜杠,而在匹配中不包含反斜杠
【发布时间】:2021-09-13 19:58:51
【问题描述】:

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

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

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

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

任何人都可以制作一个可以完成此操作的正则表达式吗?

例子:

有效输入字符串:\\&lt;@!123&gt;
匹配:&lt;@!123&gt;

输入字符串无效:\\\&lt;@!123&gt;
匹配:无

有效输入字符串:&lt;@123&gt;test&lt;@456&gt;
匹配:&lt;@123&gt;, &lt;@456&gt;

输入字符串无效:\&lt;@123&gt;test\\\&lt;@456&gt;
匹配:无

【问题讨论】:

  • @anubhava 确定
  • 只需使用捕获组并提取其内容即可。使用String regex = "(?&lt;!\\\\)(?:\\\\{2})*(&lt;@!?\\d+&gt;)" - 请参阅stackoverflow.com/a/17969620/3832970 如何获取组值。
  • @WiktorStribiżew 谢谢!您的解决方案有效

标签: java regex


【解决方案1】:

您可以使用(?&lt;!\\)(?:\\\\)*(&lt;@!?\d+&gt;) 正则表达式捕获您需要的子字符串。请参阅regex demo。

模式中的(&lt;@!|&lt;@) 部分匹配&lt;@! 或&lt;@,区别仅在于! 字符。因此,将其替换为与&lt;@ 匹配的简单&lt;@!? 模式以及可选的! 字符是合乎逻辑的。然后,捕获整个(&lt;@!?\d+&gt; 部分,并使用Java 代码获取它。

见Java demo:

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>

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多