如果在正则表达式和 Javascript 中缺少年份,请添加年份

Add Year If Missing in Regex and Javascript

我正在从 date 字段中获取完整日期。 我想如果找到 fulldate 字符串,则使用它,否则使用带有单词的月份,在本例中为 11 月 29 日。在我下面的代码中,2019 年已经存在,因此必须使用它。

预期输出应该类似于示例

2019-11-29T12:00:00.000Z

let date = "0 Hi Nov 29 HELLO - 29112019";
let months = "(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)";
let regex = new RegExp(months + " \d{1,2}(?: \d{4})?");

const result = date.match(regex).match(/ \d{4}$/)
                  ? date.match(regex).match(/ \d{4}$/)
                  : moment(
                      date.match(regex) +
                        " " +
                        new Date().getFullYear()
                    ).toDate() || "";
                    
                    
 console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

您需要在 recognizable format 中传递日期。

这是一种可能的解决方案:

let date = "0 Hi Nov 29 HELLO - 21112019";
let months = "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)";
let regex = new RegExp("(?:.*\D)?((?:0?[1-9]|[12]\d|3[01])(?:0?[1-9]|1[0-2])(?:19|20)\d{2})|" + months + "\s+(\d{1,2})(?:\s+(\d{4}))?");

let match = date.match(regex);
if (match) {
  if (match[1]) {
    console.log(moment(match[1], "DDMMYYYY").format("YYYY-MM-DD[T]HH:mm:ss[Z]"));
  } else {
    if (match[4] === undefined) {
      match[4] = new Date().getFullYear()
    }
    console.log(moment(`${match[2]} ${match[3]} ${match[4]}`, "MMM DD YYYY").format("YYYY-MM-DD[T]HH:mm:ss[Z]"));
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

请注意,该模式看起来像 (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+(\d{1,2})(?:\s+(\d{4}))?,并将月份名称匹配到第 1 组中,将日期匹配到第 2 组中,将年份(如果存在)匹配到第 3 组中。\s+ 匹配一个或多个空格。如果第 3 组不匹配,match[2] 将是 undefined,您可以将其替换为当前年份。

MMM 表示 moment.locale() 设置的区域设置中的月份名称。

请注意,您使用的模式在两边都没有边界,并且可以作为较长子字符串的一部分进行匹配。因此,至少使用单词边界使其更精确是有意义的:

let regex = new RegExp("\b" + months + "\s+(\d{1,2})(?:\s+(\d{4}))?\b");

或者,在开头有一个单词边界,在结尾有一个 (?!\d) 前瞻(以确保在 day/year 之后没有其他数字):

let regex = new RegExp("\b" + months + "\s+(\d{1,2})(?:\s+(\d{4}))?(?!\d)");