java - Java 正则表达式:需要零个/偶数个反斜杠,而不包括匹配中的反斜杠
问题描述
我需要一个正则表达式来匹配所有被 <@! 或 <@ 和 >。匹配项不能跟随奇数个反斜杠,但可以跟随零个或偶数个反斜杠。
目前,我有这个正则表达式:
(?<!\\)(?:\\{2})*(<@!|<@)[0-9]+>
问题是匹配项包含反斜杠,我需要一个不包含反斜杠的正则表达式。
任何人都可以制作一个可以做到这一点的正则表达式吗?
例子:
有效输入字符串:\\<@!123>
匹配:<@!123>
无效的输入字符串:\\\<@!123>
匹配:无
有效输入字符串:<@123>test<@456>
匹配:<@123>, <@456>
无效的输入字符串:\<@123>test\\\<@456>
匹配:无
解决方案
您可以使用(?<!\\)(?:\\\\)*(<@!?\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>
推荐阅读
- java - AWS JAVA IoT 客户端每 10 分钟重新连接一次
- ios - 使用 AVAssetExportSession 导出文件而不更改其格式(Swift 5)
- ruby-on-rails - 数字海洋 Kubernetes 节点规模 -> 503
- javascript - 如何正确读取文件(csv 或 txt)并在 JavaScript/Html 中打印其内容?
- android - 从 Android 如何检查应用程序是从 App bundle 还是从 APK 安装的
- python - 如何安装和激活库 numpy
- c# - 作为 docker 容器运行时,无法从程序集“Hangfire.AspNetCore”加载类型“Hangfire.HangfireEndpointRouteBuilderExtensions”
- xcode - 是否可以在 macOS Big Sur 中运行 Xcode11?
- c# - EF Core 3 - 在 Where 子句中使用字符串的扩展方法
- android - Retrofit/Moshi:平台类 java.util.Date 需要显式注册 JsonAdapter