问题描述
我用正则表达式尝试了几个小时:我需要一个正则表达式来选择下划线内的所有内容。 示例:
\_italic\_
但唯一的条件是我需要它忽略 \\_
(反斜杠后跟下划线)。
因此,这将是一个匹配项(\_
内的所有文本):
\_italic some text 123 \\_*%&$ _
到目前为止我有这个正则表达式:
(\_.*?\_)(?!\\\_)
但没有忽略 \\_
哪个正则表达式有效?
解决方法
你可以使用
(?s)(?<!\\)(?:\\{2})*_((?:[^\\_]|\\.)+)_
参见regex demo。 详情:
-
(?s)
- 等于Pattern.DOTALL
的内联嵌入标志选项
-
(?<!\\)(?:\\{2})*
- 前面没有紧跟反斜杠和零个或多个双反斜杠序列的位置 -
_
- 下划线 -
((?:[^\\_]|\\.)+)
- 捕获组 1:除\
和_
之外的任何字符的一次或多次出现,或任何转义字符(\
和任何一个字符) -
_
- 下划线
List<String> strs = Arrays.asList("xxx _italic some text 123 \\_*%&$ _ xxx","\\_test_test_");
String regex = "(?s)(?<!\\\\)(?:\\\\{2})*_((?:[^\\\\_]|\\\\.)+)_";
Pattern p = Pattern.compile(regex);
for (String str : strs) {
Matcher m = p.matcher(str);
List<String> result = new ArrayList<>();
while(m.find()) {
result.add(m.group(1));
}
System.out.println(str + " => " + String.join(",",result));
}
输出:
xxx _italic some text 123 \_*%&$ _ xxx => italic some text 123 \_*%&$
\_test_test_ => test