有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于斜体标记的java正则表达式

我用正则表达式试了好几个小时:我需要一个正则表达式来选择里面的所有内容。 例如:

\_italic\_

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

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

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

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

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

但是并没有忽略\\_

哪个正则表达式有效


共 (1) 个答案

  1. # 1 楼答案

    你可以用

    (?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