数组列表中有两行包含数字
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个数字。
答案 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+次除换行符以外的任意字符例如
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
来匹配水平空格字符。