有一个字符串,如果该模式匹配只需要返回前几个字符。
String str = "PM 17/PM 19 - Test String";
期望返回字符串 --> PM 17
这是我的字符串模式检查:
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;
}
最佳答案
您可以在此处使用 .replaceFirst
和捕获组来代替 .matches
:
str = str.replaceFirst( "^(PM\\s*\\d+)/PM\\s*\\d+.*$", "$1" );
//=> PM 17
正则表达式详细信息:
^
:行开始(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);
}
关于java 字符串正则表达式模式匹配和替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58289329/