java字符串正则表达式模式匹配并替换字符串

时间:2019-10-08 15:16:36

标签: java regex string

有一个字符串,如果该模式匹配只需返回前几个字符。

String str = "PM 17/PM 19 - Test String"; 

期望返回字符串-> PM 17

这是我的String模式检查:

1)始终以 PM
开头 2)然后是空格(或某个时间为零的空格)
3)然后加上一些数字
4),然后跟斜杠(即/)
5),然后跟相同的字符串 PM
6)然后是空格(或某个时间为零的空格)
7)然后是数字
8)然后是其他任何字符/字符串。

如果给定的字符串与上述模式匹配,我需要获取字符串直到斜杠(即 PM 17

我尝试下面的方法,但不适用于这种情况。

  if(str.matches("PM\\s+[0-9.]/PM(.*)")) { //"PM//s+[0-9]/PM(.*)"
                  str = str.substring(0, str.indexOf("/"));
                  flag = true;
  } 

1 个答案:

答案 0 :(得分:1)

您可以在此处将.matches代替.replaceFirst并使用捕获组

str = str.replaceFirst( "^(PM\\s*\\d+)/PM\\s*\\d+.*$", "$1" );
//=> PM 17

RegEx Demo

RegEx详细信息:

  • ^:行开始
  • (PM\\s*\\d+):匹配和分组文本,以PM开头,后跟0或多个空格,后跟1或多个数字
  • /PM\\s*\\d+:匹配/PM,后跟0或多个空格,后跟1或多个数字
  • .*$:在行尾匹配任何#个字符
  • $1:是替换,它将捕获的第一组字符串放回替换中。

如果要在提取子字符串之前进行输入验证,则建议使用以下代码:

final String regex = "(PM\\s*\\d+)/PM\\s*\\d+.*";    
final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(str);

if (matcher.matches()) {
    flag = true;
    str = matcher.group(1);
}