我需要一个正则表达式来匹配所有被<@所包围的数字!或<@ and >。匹配不能跟随奇数反斜杠,但可以跟随零或偶数反斜杠。
目前,我有一个正则表达式:
(?<!\\)(?:\\{2})*(<@!|<@)[0-9]+>
问题是,匹配的包含,反斜杠,我需要一个正则表达式来执行,而不是,包括反斜杠。
有人能做一个正则表达式来完成这个任务吗?
示例:
有效输入字符串:\\<@!123>
匹配:<@!123>
无效输入字符串:\\\<@!123>
匹配:无
有效输入字符串:<@123>test<@456>
匹配:<@123>, <@456>
无效输入字符串:\<@123>test\\\<@456>
匹配:无
发布于 2021-07-01 20:13:20
您可以使用(?<!\\)(?:\\\\)*(<@!?\d+>)
正则表达式捕获所需的子字符串。见regex演示。
模式中的(<@!|<@)
部分与<@!
或<@
匹配,区别仅在!
字符中。因此,用一个简单的<@!?
模式来替换它是合乎逻辑的,这个模式可以匹配<@
,然后是一个可选的!
字符。然后,捕获整个(<@!?\d+>
部分,并使用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>
https://stackoverflow.com/questions/68215436
复制相似问题