java 模式匹配正则表达式

java pattern match regex

我有以下字符串:

String p = "{requestId=146bb94xxxxxR, value=false, tier=S3,ReceivedTime=0}";

我想提取请求 Id 值,所以希望我的输出是

146bb94xxxxxR

这是我试过的

Pattern MY_PATTERN = Pattern.compile("\requestId=(.*?)\,");
Matcher m = MY_PATTERN.matcher(p);
while (m.find()) {
    String s = m.group(1); // s now contains "BAR"
}

但是我没有得到任何输出,正则表达式有问题,但我不确定如何更正它。

您的正则表达式转义了请求中的 r 和毫无意义的 ,。尝试

\brequestId=([^,]*),

这将匹配单词边界 - \b,然后是 requestId=,然后捕获 ID(直到 ,

Pattern.compile("requestId=(.*?),");

你应该删除多余的字符转义(\,\r(这意味着carriage-return字符)),它会工作正常。

你也可以试试这个:

(?<=requestId=)(\w*)

你不需要用 \(写成字符串 "\")包围你的正则表达式,就像你之前在评论中提到的例子:Using Java to find substring of a bigger string using Regular Expression\ 用于转义少数正则表达式特殊字符,其中 ware []

所以你的正则表达式 Pattern.compile("\requestId=(.*?)\,") \r 部分将代表 \rcarriage return (行分隔符之一)。因此,删除 r 之前的 \。此外,您不需要使用 \ 转义 ,,因为它不是正则表达式特殊字符(至少在这种情况下不是)。所以尝试:

Pattern MY_PATTERN = Pattern.compile("requestId=(.*?),");
Matcher m = MY_PATTERN.matcher(" {requestId=146bb94xxxxxR, value=false, tier=S3,ReceivedTime=0}");
while (m.find()) {
    String s = m.group(1);
    System.out.println(s);
}
public static void main(String[] args) {
        String text = "{requestId=146bb94xxxxxR, value=false, tier=S3,ReceivedTime=0}";
        Pattern p = Pattern.compile("requestId=(.*?),");
        Matcher m = p.matcher(text);
        m.find();
        System.out.println(m.group(1));
}

输出: 146bb94xxxxxR