正则表达式匹配日期与特殊字符前缀

时间:2013-11-11 16:22:59

标签: javascript regex

我有以下代码:

var splitter = (filterValue.length > 0 ? filterValue.match(/^\s*(<|>)?\s*(\d\d\/\d\d\/\d{4})\s*\-?\s*(\d\d\/\d\d\/\d{4})?\s*$/).slice(1) : '');

filterValue可能是:

01/01/2013

> 01/01/2013

< 01/01/2013

01/01/2013 - 01/01/2013

然后我把它们分成几块:

    var string1 = (splitter.length > 0 ? splitter[0] : '');
    var string2 = (splitter.length >= 2 ? splitter[1] : '');
var string3 = (splitter.length >= 3 ? splitter[2] : '');
var string4 = (splitter.length < 4 ? splitter[3] : '');
对于上述示例,

string1可能是'', '>', '<', ''

string2永远是第一个日期

如果短划线存在于两个日期之间,则

string3可以是'''-'

string4将是最后一次约会。

但是我无法让最后一个场景奏效。所以假设我的正则表达式中有一个问题来处理这个问题。有谁能看到这个问题?

小提琴:http://jsfiddle.net/7LR49/1/

我得到了:

undefined
01/01/2013
01/01/2013
undefined

当我应该得到:

undefined
01/01/2013
-
01/01/2013

并在拆分器上执行控制台显示:

[undefined, "01/01/2013", "01/01/2013"]

所以最后一个第三个键并没有被正则表达式实际拾取。而取而代之的是第四位。

2 个答案:

答案 0 :(得分:2)

一些修复:

  • 你的正则表达式并没有将破折号视为第三组。所以我改变了它。

来自:/^\s*(<|>)?\s*(\d\d\/\d\d\/\d{4})\s*\-?\s*(\d\d\/\d\d\/\d{4})?\s*$/
至......:/^\s*(<|>)?\s*(\d\d\/\d\d\/\d{4})\s*(\-)?\s*(\d\d\/\d\d\/\d{4})?\s*$/
已更改:.................................^..^

  • 你的情况并没有发展到true所以你会忽略最后一组的价值:

来自:var string4 = (splitter.length < 4 ? splitter[3] : '');
至......:var string4 = (splitter.length < 5 ? splitter[3] : '');
已更改:..............................^

立即输出:

undefined
01/01/2013
-
01/01/2013 

你的小提琴,更新:http://jsfiddle.net/7LR49/2/

答案 1 :(得分:0)

以下适用于我:

function getMatches(string, regex, index) {
    index || (index = 1); // default to the first capturing group
    var matches = [];
    var match;
    while (match = regex.exec(string)) {
        matches.push(match[index]);
    }
    return matches;
  }
  var str = "> 01/01/2013 - 02/01/2013";
  var regex = /\b(\d\d\/\d\d\/\d\d\d\d)\b/g;
  var matches = getMatches(str, regex, 1);
  alert(matches[0]);
  alert(matches[1]);

<强>输出:

01/01/2013
02/01/2013

该方法取自here