斜体降价的正则表达式

问题描述

我用正则表达式尝试了几个小时:我需要一个正则表达式来选择下划线内的所有内容。 示例:

\_italic\_

但唯一的条件是我需要它忽略 \\_(反斜杠后跟下划线)。

因此,这将是一个匹配项(\_ 内的所有文本):

\_italic some text 123 \\_*%&$ _

到目前为止我有这个正则表达式:

(\_.*?\_)(?!\\\_) 

但没有忽略 \\_

哪个正则表达式有效?

解决方法

你可以使用

(?s)(?<!\\)(?:\\{2})*_((?:[^\\_]|\\.)+)_

参见regex demo详情

  • (?s) - 等于 Pattern.DOTALL
  • 的内联嵌入标志选项
  • (?<!\\)(?:\\{2})* - 前面没有紧跟反斜杠和零个或多个双反斜杠序列的位置
  • _ - 下划线
  • ((?:[^\\_]|\\.)+) - 捕获组 1:除 \_ 之外的任何字符的一次或多次出现,或任何转义字符(\ 和任何一个字符)
  • _ - 下划线

Java demo

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...