Java 单一模式匹配SMS消息中的数字,允许使用2种格式
我正在从SMS中提取数字,其中我只想提取以下任一格式的数字:Java 单一模式匹配SMS消息中的数字,允许使用2种格式,java,android,regex,Java,Android,Regex,我正在从SMS中提取数字,其中我只想提取以下任一格式的数字: ID is xxx For User: yyyy ID:xxxx 当我使用“\\d+”时,它会提取用户名(yyy),而不是xxxx 我还尝试了模式\d+|[ID:][d+,但它只适用于带有用户名的SMS,而不适用于第一种类型 有没有办法编写一个正则表达式,如果这个模式不匹配,它会在Android中检查另一个模式 另外,我尝试了两种不同的模式,分别使用if和elseif,但也不起作用。例如: public Pattern p = Pa
ID is xxx
For User: yyyy ID:xxxx
当我使用“\\d+”
时,它会提取用户名(yyy
),而不是xxxx
我还尝试了模式\d+|[ID:][d+
,但它只适用于带有用户名的SMS,而不适用于第一种类型
有没有办法编写一个正则表达式,如果这个模式不匹配,它会在Android中检查另一个模式
另外,我尝试了两种不同的模式,分别使用if和elseif,但也不起作用。例如:
public Pattern p = Pattern.compile("\\d+");
public Pattern q=Pattern.compile("[ID:]\\d+");
if (msgbody.contains("ID"){
final Matcher m = p.matcher(msgbody);
final Matcher n = q.matcher(msgbody);
if(m.find()){
\\first pattern p matched.
} else if(n.find()){
\\Second Pattern q matched
}
}
虽然完全可以测试任意多个正则表达式匹配项,但两个测试用例都匹配
\\d
。然后,您没有针对第二个表达式进行测试(这将无法实现您想要的结果)
您可以将用户的ID为xxx
和:xxxx ID:yyyy
与单个正则表达式匹配
使用以下表达式:
^(?:For User: \\S+ ID:|ID is )(\\d+)$
…(?:
…|
是一个包含两个备选方案的组)
与第二种情况下的文本匹配,并且与任何不包含空格的用户名匹配对于用户:\\S+ID:
ID与您的第一个案例完全匹配
匹配一个数字,捕获匹配项(稍后我们可以将其称为(\\d+)
)m.group[1]
String msgbody = "ID is 12345"; //For testing purposes
Pattern idPatt = Pattern.compile("^(?:For User: \\S+ ID:|ID is )(\\d+)$");
Matcher m = idPatt.matcher(msgbody);
if (m.find()) {
//Print the text matched by the first group (in parentheses)
System.out.println("Matched: " + m.group(1));
} else {
System.out.println("Invalid message body");
}