当有效时匹配数字和破折号的正则表达式

时间:2018-04-30 16:22:17

标签: javascript regex

我有以下正则表达式Iter partition(Iter first, Iter last, UnaryPredicate pred, std::forward_iterator_tag); Iter partition(Iter first, Iter last, UnaryPredicate pred, std::bidirectional_iterator_tag);

我希望它在iso日期时不匹配:

e.g。 [0-9-]{4}-[0-9-]{2}-[0-9-]{2}$

但我希望它与1970-01-011979------匹配。

--------29

如果我只使用javascript,我会说-----11---

2 个答案:

答案 0 :(得分:1)

您可能会发现以下模式令人满意:

let rec nb_blacks_lftmst acc = function
  | Empty -> acc
  | T (c, lft, _, _) ->
    nb_blacks_lftmst (match c with R -> acc | B -> acc + 1) lft

let good_count = function
  | Empty -> true
  | T (_, lft, _, rgt) ->
    let cpt = nb_blacks_lftmst 0 lft in
    let rec aux acc = function
      | Empty -> acc = cpt
      | T (c, lft, _, rgt) ->
        let acc = match c with R -> acc | B -> acc + 1 in
        aux acc lft && aux acc rgt
    in
    aux 0 lft && aux 0 rgt

模式开头的第一个前瞻断言^(?=.*\-\-)(?=.*[0-9]{2})(?:[0-9]{4}|\-{4})-(?:[0-9]{2}|\-{2})-(?:[0-9]{2}|\-{2})$ 至少出现一次,确保日期不是完整的ISO日期。第二个前瞻断言至少存在一个日期组件,阻止--成为匹配。

Demo

答案 1 :(得分:0)

你可以使用这样的负面超前技巧:

(?!\d{4}-\d{2}-\d{2})^[0-9-]{4}-[0-9-]{2}-[0-9-]{2}$

<强> Working demo enter image description here

顺便说一下,你可以这样缩短你的正则表达式:

(?!\d{4}-\d{2}-\d{2})^[\d-]{4}-[\d-]{2}-[\d-]{2}$

更新:正如评论中提到的ctwheels,你可以通过在这样的外观中使用锚点来提高正则表达式的效率:

^(?!\d{4}-\d{2}-\d{2})[0-9-]{4}-[0-9-]{2}-[0-9-]{2}$