【问题标题】:regex pattern for matching dd mm only仅匹配 dd mm 的正则表达式模式
【发布时间】:2021-02-05 06:21:39
【问题描述】:

我正在寻找匹配日期 1 到 31 以及 1 月到 12 月的数据模式,现在我正在使用此模式 ([1-9]|0[1-9]|1[0-9]|2[0-9]|3[01]).[a-zA-Z] 但效果不佳,请告诉我此模式有什么问题.

输出应该是这样的 -

1 月 1 日 - 1 月 31 日,

1 月 1 日 - 1 月 31 日,

1 月 1 日 - 1 月 31 日,

【问题讨论】:

  • 使用此模式,日期超过 2 位
  • 到底缺少+?有什么不好的地方?
  • 请检查我附上了一张图片,问题是它可以正常工作 1 到 31 位数字,但也可以使用大于 31 的数字,这是我不想要的
  • 如果我的回答没有解决您的问题,请考虑更新问题。

标签: javascript regex date


【解决方案1】:

你可以试试下面的正则表达式:

\d{1,2}.[a-zA-Z]{3,8}

【讨论】:

  • 它也不应该与大于 31 一起使用
【解决方案2】:

使用正则表达式,您无法直接识别 1-31 之类的数字范围,但您可以组合一些 ORed 模式:

/^(?:0?[1-9]|[12][0-9]|3[01]) +[JFMASOND][a-z]+$/.test('1 Jan')
true
/^(?:0?[1-9]|[12][0-9]|3[01]) +[JFMASOND][a-z]+$/.test('01 Jan')
true
/^(?:0?[1-9]|[12][0-9]|3[01]) +[JFMASOND][a-z]+$/.test('10 Jan')
true
/^(?:0?[1-9]|[12][0-9]|3[01]) +[JFMASOND][a-z]+$/.test('25 Jan')
true
/^(?:0?[1-9]|[12][0-9]|3[01]) +[JFMASOND][a-z]+$/.test('30 Jan')
true
/^(?:0?[1-9]|[12][0-9]|3[01]) +[JFMASOND][a-z]+$/.test('31 Jan')
true
/^(?:0?[1-9]|[12][0-9]|3[01]) +[JFMASOND][a-z]+$/.test('32 Jan')
false

解释:

  • (?: ... ) - 非捕获组,用于 OR 模式
  • 0?[1-9] - 数字 1-9,可选零填充
  • | - 或
  • [12][0-9] - 10-29 号
  • | - 或
  • 3[01] - 30-31 号
  • + - 1+ 个空格
  • [JFMASOND][a-z]+ - 1 月至 12 月的首字母大写,后跟 1+ 个小写字母
  • 如果你想对月份更严格,你可以用缩写明确说明所有月份,例如(Jan(uary)?|Feb(ruary)?|Mar(ch)?| ... )

【讨论】:

    【解决方案3】:

    你可以使用

    /\b(?:0?[1-9]|[12][0-9]|3[01])\s*(?:Jan(?:\.|(?:uary)?\b)|Feb(?:\.|(?:ruary)?\b)|Mar(?:\.|(?:ch)?\b)|Apr(?:\.|(?:il)?\b)|May\b\.?|Jun(?:e?\b|\.)|Jul(?:y?\b|\.)|Aug(?:\.|(?:ust)?\b)|Sep(?:\.|(?:tember)?\b)|Oct(?:\.|(?:ober)?\b)|Nov(?:\.|(?:ember)?\b)|Dec(?:\.|(?:ember)?\b))/gi
    

    请参阅regex demo详情

    • \b - 字边界
    • (?:0?[1-9]|[12][0-9]|3[01]) - 一个从 131 的数字,对于从 19 的数字,可选前导 0
    • \s* - 零个或多个空格
    • (?:Jan(?:\.|(?:uary)?\b)|Feb(?:\.|(?:ruary)?\b)|Mar(?:\.|(?:ch)?\b)|Apr(?:\.|(?:il)?\b)|May\b\.?|Jun(?:e?\b|\.)|Jul(?:y?\b|\.)|Aug(?:\.|(?:ust)?\b)|Sep(?:\.|(?:tember)?\b)|Oct(?:\.|(?:ober)?\b)|Nov(?:\.|(?:ember)?\b)|Dec(?:\.|(?:ember)?\b)) - 每个月份的名称,可以在月份名称后用一个可选的点缩写,也可以是一个完整的月份名称,但每个都应该是一个完整的单词(31 Maydays 中没有匹配项)。

    但是,这不是检查日期的有效性。为此,请在获得匹配项后使用 JavaScript 中的后处理步骤。

    查看 JavaScript 演示:

    const text = `01 Jan - 31 Jan,
    1 Jan - 31 Jan,
    1 January - 31 January,
    998 December and ! - 31 February`;
    let matches = text.match(/\b(?:0?[1-9]|[12][0-9]|3[01])\s*(?:Jan(?:\.|(?:uary)?\b)|Feb(?:\.|(?:ruary)?\b)|Mar(?:\.|(?:ch)?\b)|Apr(?:\.|(?:il)?\b)|May\b\.?|Jun(?:e?\b|\.)|Jul(?:y?\b|\.)|Aug(?:\.|(?:ust)?\b)|Sep(?:\.|(?:tember)?\b)|Oct(?:\.|(?:ober)?\b)|Nov(?:\.|(?:ember)?\b)|Dec(?:\.|(?:ember)?\b))/gi);
    console.log(matches);
    // Now, show only valid dates:
    const months = {jan:"01",feb:"02",mar:"03",apr:"04",may:"05",jun:"06",jul:"07",aug:"08",sep:"09",oct:"10",nov:"11",dec:"12"};
    const parseDate = function(s){
      var [_,d,m] = s.match(/^(\d+)\s*(\w+)/);
      return `${new Date(Date.now()).getFullYear()}-${months[m.substring(0,3).toLowerCase()]}-${d}`;
    }
    matches = matches.filter(x => moment(parseDate(x), 'YYYY-MM-DD', true).isValid());
    console.log(matches);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

    【讨论】:

      【解决方案4】:

      请注意,我只包括以大写字母开头的月份:

      reg = "\b( -?\d{1,2} [JFMAMSOND][a-z]{2,8}) \b"
      

      这将获取第一部分,例如 01 Jan,以获取整个句子(01 Jan - 31 Jan, ):

      reg = "( -?\d{1,2}[ ]?[JFMASOND][a-z]{2,7})[ ]?-[ ]?\d{1,2}[ ]?[JFMASOND][a-z]{2,7},$"
      

      [ ]?对于空格是可选的,删除 ?如果你确定你需要空间。最后一个逗号也是如此,如果您不需要在末尾查找逗号,请将其删除。

      【讨论】:

      • 题中有标签js,python就不用提了
      【解决方案5】:

      感谢朋友们的回复,但我自己用这个模式修复了它,它工作得很好

      \b(0?[1-9]|[12][0-9]|[123][0-1]|.[a-zA-Z])\b
      

      【讨论】:

      • 这是错误的,因为it will also match junk
      • 请不要将我标记为负数,如果它与文本不匹配也没关系,我的目标是只匹配数字,对我来说它有效,我认为你没有了解问题所在,用户可以输入任何类型的文本,例如(Dec、dec、DeC、December、Dcmbr),我需要匹配唯一的数字,就我而言,它运行良好
      • 不,您在问题中明确提到您需要提取月份名称。
      • 那个月份的名字是唯一的例子,那个月份是一月、二月、三月等......
      • 所以请不要给我打负分,兄弟
      【解决方案6】:

      试试这个代码

      \b(0?[1-9]|[12][0-9]|[123][0-1]|.[a-zA-Z])\b
      

      【讨论】:

        猜你喜欢
        • 2017-07-10
        • 1970-01-01
        • 2016-11-04
        • 1970-01-01
        • 2019-04-03
        • 1970-01-01
        • 1970-01-01
        • 2015-01-25
        • 1970-01-01
        相关资源
        最近更新 更多