我正在尝试从文本中获取子字符串,并使用正则表达式。 示例文字:
bla bla 1:30-2pm bla bla 5-6:30am some text 1-2:15am
我正在寻找时间范围条目(1-30-2pm ...)。使它们大胆仅出于可读性
这是我的正则表达式:
\d{1,2}(:\d{1,2})? – \d{1,2}(:\d{1,2})?(am|pm)
java代码段:
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;
}
您能帮我优化正则表达式模式吗?我可能错过了一些用例。
答案 0 :(得分:1)
我建议使用正则表达式,例如
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";
请参见regex demo
详细信息
(?i)
-不区分大小写的标志(用于AM
,PM
,am
,pm
值等)(?<!\d)
-不允许在左边立即输入数字(?:0?[1-9]|1[0-2])
-可选的0
,然后是从1
到9
的数字,或者是1
然后是0
,{{1 }}或1
2
-可选组:从(?::[0-5]\d)?
到0
的一个数字,然后是一个数字5
-任何连字符\p{Pd}
-见上文(?:0?[1-9]|1[0-2])(?::[0-5]\d)?
-[ap]m\b
或a
,然后是p
和单词边界。答案 1 :(得分:1)
如果我们想优化表达式,我们可能想添加可选的空格,以防万一我们的输入中可能还有其他空格,您的表情看起来很棒:
each
如果我们想获取数据,我们还添加了捕获组。
或者:
$('.vatcheckbox').each(function(idx) {
this.addEventListener('change', function() {
this.parentElement.parentElement.parentElement.querySelector('.vatfield').disabled = this.checked;
});
});
所需要的。
(\d{1,2})(:\d{1,2})?(\s+)?-(\s+)?(\d{1,2})(:\d{1,2})?(am|pm)
如果不需要此表达式,并且希望对其进行修改,请访问regex101.com上的此链接。
jex.im可视化正则表达式: