java - 正则表达式在 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 个数字。
解决方案
.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+ 次
例如
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
来匹配水平空白字符。
推荐阅读
- php - PHP函数执行时间长
- flutter - 如何在系统启动时启动 Flutter 应用程序?
- node.js - 如何在 Node.js 中设置 ftp-srv 的根目录
- python - 如何从 CSV 列表中获取项目
- python - Python中唯一值的聚合
- stanford-nlp - 节注释的分数
- kubernetes - 在现有 Kubernetes 集群上安装 Rancher 时出现权限错误
- google-drive-api - PyDrive 获取备份列表
- java - 在预定方法中运行 ExecutorService
- node.js - 节点测量执行时间 - 从作为参数传递给另一个函数的异步返回值