0

我有以下代码:

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"]

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

4

2 回答 2

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/

于 2013-11-11T16:59:14.387 回答
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

方法取自这里

于 2013-11-11T16:44:49.043 回答