Java 单一模式匹配SMS消息中的数字,允许使用2种格式

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

我正在从SMS中提取数字,其中我只想提取以下任一格式的数字:

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");
}