有一个字符串,如果该模式匹配只需返回前几个字符。
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;
}
答案 0 :(得分:1)
您可以在此处将.matches
代替.replaceFirst
并使用捕获组:
str = str.replaceFirst( "^(PM\\s*\\d+)/PM\\s*\\d+.*$", "$1" );
//=> PM 17
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);
}