使用正则表达式从给定的字符串值中提取子字符串

时间:2019-12-18 11:34:08

标签: java regex spring string

我有一个需要匹配的字符串,然后从该字符串中提取更多值的要求

我将在请求中收到标头,该标头的值将是ssl证书中的DN名称。这里需要匹配标题中的特定字符串1.2.3.47并提取剩余的文本。

传递给方法的样本字符串: O = ABC Bank Plc / 1.2.3.47 = ABC12-PQR-121878,CN = 7ltM2wQ3bqlDJdBEURGAMq,L = INDIA,C = INDIA,E=xyz@gmail.com

这是我的代码:

private String extractDN(String dnHeader) {
     if(!ValidatorUtil.isEmpty(dnHeader)){

       String tokens[]=dnHeader.split(",");
       if(tokens[0].contains("1.2.3.47")){

          int index=tokens[0].lastIndexOf("1.2.3.47");
          String id=tokens[0].substring(index+9);
          System.out.println(id);


       }



     }
    return id;
  }

这里可以使用正则表达式模式来匹配和提取值吗?有没有更好的方法来实现这一目标?请帮忙。

1 个答案:

答案 0 :(得分:1)

如果要使用模式,并且知道该值始终以正斜杠开头,并且如果后面跟一个或多个数字,则用点号和等号隔开,则可以使用捕获组:

>
/[0-9](?:\\.[0-9]+)+=([^,]+)
  • /匹配/
  • [0-9]+匹配1+数字0-9
  • (?:非捕获组
    • \\.[0-9]+匹配.和1个以上的数字0-9
  • )+关闭非捕获组并重复1次以上
  • =匹配=
  • ([^,]+)捕获组1,匹配除,之外的任何字符的1+倍

Regex demo | Java demo

例如

final String regex = "/[0-9]+(?:\\.[0-9]+)+=([^,]+)";
final String string = "O=ABC Bank Plc/1.2.3.47=ABC12-PQR-121878, CN=7ltM2wQ3bqlDJdBEURGAMq, L=INDIA, C=INDIA, E=xyz@gmail.com";

final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);

if (matcher.find()) {
    System.out.println(matcher.group(1));
}

输出

ABC12-PQR-121878

如果您想要更精确的匹配,还可以指定模式的开头:

\\bO=\\w+(?:\\h+\\w+)*/[0-9]+(?:\\.[0-9]+)+=([^,]+)

Regex demo