java - 如何优化正则表达式模式?
问题描述
我正在尝试从文本中获取子字符串并使用正则表达式。示例文本:
bla bla 1:30-2pm bla bla 5-6:30am一些文字1-2:15am
我正在寻找时间框架条目(1-30-2pm ...)。将它们加粗仅是为了便于阅读
这是我的正则表达式:
\d{1,2}(:\d{1,2})? – \d{1,2}(:\d{1,2})?(am|pm)
爪哇片段:
public static List<String> foo(String text, String regex) {
List<String> entries = new ArrayList<>();
Matcher matcher = Pattern.compile(regex).matcher(text);
while (matcher.find()) {
entries.add(matcher.group());
}
return entries;
}
你能帮我优化正则表达式模式吗?可能有一些我错过的用例。
解决方案
我建议使用正则表达式
String regex = "(?i)(?<!\\d)(?:0?[1-9]|1[0-2])(?::[0-5]\\d)?\\p{Pd}(?:0?[1-9]|1[0-2])(?::[0-5]\\d)?[ap]m\\b";
查看正则表达式演示
细节
(?i)
- 不区分大小写的标志(forAM
,PM
,am
,pm
values 等)(?<!\d)
- 不允许紧靠左边的数字(?:0?[1-9]|1[0-2])
- 一个可选的0
,然后是一个数字,从1
to9
,或1
然后0
,1
或2
(?::[0-5]\d)?
- 一个可选组:一个数字从0
到5
然后任何一个数字\p{Pd}
- 任何连字符(?:0?[1-9]|1[0-2])(?::[0-5]\d)?
- 看上面[ap]m\b
-a
orp
and thenm
和一个单词边界。
推荐阅读
- python - Django: DeferredAttribute object / choices field as string value to modify Context in class based ListView
- java - 对 MySQL 的访问被拒绝,无法创建与数据库服务器的连接
- firebase - 在 React Native 中删除已发送的推送通知
- django - Django 模型类始终排除“未发布”实例的一般规则
- swift - Xcode 10.1 Swift 文件修改触发大量编译器错误
- sql - 如何在pyspark中读取sql文件?
- excel - 我可以在调用 SQL 的同时调用命令窗口运行吗?
- elasticsearch - 名称为彼此子字符串的 Elasticsearch 键
- laravel - Laravel pagination-sm pagination-lg 类不能针对不同的断点一起工作
- javascript - Storybook 构建版本的故事在使用 rewiremock 时崩溃