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

java字符串正则表达式模式匹配和替换字符串,java,regex,string,Java,Regex,String,有一个字符串,如果该模式匹配,则只需返回前几个字符 String str = "PM 17/PM 19 - Test String"; 应为返回字符串-->pm17 下面是我的字符串模式检查: 1) 始终以PM开始 2) 然后是空间(或某个时间零空间) 3) 然后后面跟着一些数字 4) 然后是斜杠(即/) 5) 然后后跟相同的字符串PM 6) 然后是空间(或某个时间零空间) 7) 然后是数字 8) 然后是任何其他字符/字符串 如果给定的字符串与上述模式匹配,我需要在斜杠之前获取字符串(即pm

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

String str = "PM 17/PM 19 - Test String"; 
应为返回字符串-->
pm17

下面是我的字符串模式检查:

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

如果给定的字符串与上述模式匹配,我需要在斜杠之前获取字符串(即pm17

我试过下面的方法,但在这种情况下不起作用

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

您可以在此处使用带有捕获组的
.replaceFirst
,而不是
.matches

正则表达式详细信息:

  • ^
    :行开始
  • (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);
}

PM
在正则表达式中不显示。你看到了吗?用PM更正了。下一期:
[0-9]
匹配一个数字,而不是多个数字,例如
17
/s+
表示“两个前斜杠,文字
s
字符重复1到无限次”。你的意思可能是
\\s+
试试
^PM\s*\d{2}
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);
}