斜体降价的正则表达式

Regex for italic markdown

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

\_italic\_

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

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

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

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

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

但不忽略 \_

哪个正则表达式可以工作?

您可以使用

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

regex demo详情:

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

参见 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