首页 > 解决方案 > 正则表达式在 android 中的帮助

问题描述

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

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

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

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

标签: javaregex

解决方案


.matches如下面评论中所述,如果可以匹配整个字符串,您正在使用which 返回 true。

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

您可能会做的是使用交替来匹配日期格式,其中包括分隔符在内的前 2 部分是可选的。或匹配 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+ 次

正则表达式演示| Java 演示

例如

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来匹配水平空白字符。


推荐阅读