android中的正则表达式帮助

时间:2019-06-22 07:24:02

标签: java regex

数组列表中有两行包含数字

line1 1234 5694 7487
line2 10/02/1992 or 1992

我使用了不同的正则表达式来获得这两行,但是问题是当我使用正则表达式([0-9]{4}//s?)([0-9]{4}//s?)([0-9]{4}//n)时。第一行很酷。

但是为了检查第2行,我使用了([0-9]{2}[/-])?([0-9]{2}[/-])?([0-9]{4})。 此正则表达式而不是返回最后一行,而是返回第1行的前4个数字。

1 个答案:

答案 0 :(得分:0)

如下面的注释所述,您正在使用.matches,如果可以匹配整个字符串,则返回true。

在您的模式([0-9]{2}[/-])?([0-9]{2}[/-])?([0-9]{4})中,它也只能匹配4位数字,因为前两个组([0-9]{2}[/-])?([0-9]{2}[/-])?是可选的,因为问号?使第三个组([0-9]{4})可以匹配4位数字。

您可能要做的是使用一种替代方式来匹配日期(如格式),其中前两个部分(包括定界符)是可选的。或匹配3个4位数字。

.*?(?:(?:[0-9]{2}[/-]){2}[0-9]{4}|[0-9]{4}(?:\h[0-9]{4}){2}).*

说明

  • .*?匹配除换行符非贪婪以外的任何字符
  • (?:非捕获组
    • (?:[0-9]{2}[/-]){2}重复2次,匹配2位数字和/-
    • [0-9]{4}匹配4位数字
    • |
    • [0-9]{4}匹配4位数字
    • (?:\\h[0-9]{4}){2}重复2次以匹配水平空白字符和4位数字
  • )关闭非捕获组
  • .*匹配0+次除换行符以外的任意字符

Regex demo | Java demo

例如

List<String> list = Arrays.asList(
new String[]{
    "10/02/1992 or 1992",
    "10/02/1992",
    "10/1992",
    "02/1992",
    "1992",
    "1234 5694 7487"

    }
);

String regex = ".*?(?:(?:[0-9]{2}[/-]){2}[0-9]{4}|[0-9]{4}(?:\\h[0-9]{4}){2}).*";

for (String str: list) {
    if (str.matches(regex)){
        System.out.println(str);
    }
}

结果

10/02/1992 or 1992
10/02/1992
1234 5694 7487

请注意,在第一个模式中,我认为您的意思是\\s而不是//s

\\s也将与换行符匹配。如果要匹配一个空格,则可以匹配该空格或使用\\h来匹配水平空格字符。