如何优化正则表达式模式?

时间:2019-06-07 16:55:03

标签: java regex text regex-lookarounds regex-group

我正在尝试从文本中获取子字符串,并使用正则表达式。 示例文字:

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;
}

您能帮我优化正则表达式模式吗?我可能错过了一些用例。

2 个答案:

答案 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)-不区分大小写的标志(用于AMPMampm值等)
  • (?<!\d)-不允许在左边立即输入数字
  • (?:0?[1-9]|1[0-2])-可选的0,然后是从19的数字,或者是1然后是0,{{1 }}或1
  • 2-可选组:从(?::[0-5]\d)?0的一个数字,然后是一个数字
  • 5-任何连字符
  • \p{Pd}-见上文
  • (?:0?[1-9]|1[0-2])(?::[0-5]\d)?-[ap]m\ba,然后是p和单词边界。

答案 1 :(得分:1)

如果我们想优化表达式,我们可能想添加可选的空格,以防万一我们的输入中可能还有其他空格,您的表情看起来很棒:

each

如果我们想获取数据,我们还添加了捕获组。

Demo 1

或者:

$('.vatcheckbox').each(function(idx) {
  this.addEventListener('change', function() {
    this.parentElement.parentElement.parentElement.querySelector('.vatfield').disabled = this.checked;
  });
});

Demo 2

所需要的。

测试

(\d{1,2})(:\d{1,2})?(\s+)?-(\s+)?(\d{1,2})(:\d{1,2})?(am|pm)

RegEx

如果不需要此表达式,并且希望对其进行修改,请访问regex101.com上的此链接。

RegEx电路

jex.im可视化正则表达式:

enter image description here