regex 如何使用JavaScript从字符串中提取日期

unguejic  于 2023-06-25  发布在  Java
关注(0)|答案(6)|浏览(102)

如何使用JavaScript从字符串中提取日期?它可以采用以下格式:
31.07.2014
07.31.2014
2014.07.31相同的格式但以空格或/或分隔- 31 07 2014 31/07/2014 31-07-2014
字符串可以包含其他字符
Teen.Wolf.S04E06.Orphaned.28.07.2014.HDTV
如何从这些类型名称中提取日期。
我想先提取所有的数字,然后比较它是否大于12,以确保它是月份或日期。我不太了解regEx(正则表达式),所以如果使用它,请解释一下,谢谢

r1wp621o

r1wp621o1#

可能使用正则表达式,如

/(\d{4}([.\-/ ])\d{2}\2\d{2}|\d{2}([.\-/ ])\d{2}\3\d{4})/

\d - a digit (equivilant to character class [0-9]
{n} - match n characters
[.\-/ ] - character class matches a single . - / or space (- needs to be escaped because it indicates a range in a character class
\n - a backreference matches the nth match so / will match another / and not a -, /, space or .

你可以拉出正则表达式的第一部分并检查它,它与第二部分相同,除了4位和2位被交换了

/\d{4}([.\-/ ])\d{2}\1\d{2}/
wko9yo5t

wko9yo5t2#

也许这可以帮助你(Demo Fiddle here):

function getDate(d)
{
    var day, month, year;

    result = d.match("[0-9]{2}([\-/ \.])[0-9]{2}[\-/ \.][0-9]{4}");
    if(null != result) {
        dateSplitted = result[0].split(result[1]);
        day = dateSplitted[0];
        month = dateSplitted[1];
        year = dateSplitted[2];
    }
    result = d.match("[0-9]{4}([\-/ \.])[0-9]{2}[\-/ \.][0-9]{2}");
    if(null != result) {
        dateSplitted = result[0].split(result[1]);
        day = dateSplitted[2];
        month = dateSplitted[1];
        year = dateSplitted[0];
    }

    if(month>12) {
        aux = day;
        day = month;
        month = aux;
    }

    return year+"/"+month+"/"+day;
}
yqyhoc1h

yqyhoc1h3#

RegEX将帮助您提取具有不同类型格式的日期,并以数组形式返回,

let str="dd/mm/yyyy06/06/2018 yyyy/mm/dd 2018/02/12 d/m/yy 1/1/18 dd/mm/yy 18/12/12 mm/d/yyyy 12/2/2018 m/dd/yyyy 1/12/2018 yy/m/d 18/1/1 yy/mm/d 18/12/1 yyyy/2018/1/1";
str.match(/(\d{1,4}([.\-/])\d{1,2}([.\-/])\d{1,4})/g);

Reference Link From regextester

svdrlsy4

svdrlsy44#

我认为你可以使用正则表达式来实现这一点。您需要的三个主要表达式如下:

[0-9]{4} // year
(0[1-9]|1[0-2]) // month
(0[1-9]|[1-2][0-9]|3[0-1]) // day

您可以合并这些以适应您提到的格式,例如,匹配“31.07.2014”:

(0[1-9]|[1-2][0-9]|3[0-1])\.(0[1-9]|1[0-2])\.[0-9]{4}

或“2014年7月31日”:

(0[1-9]|[1-2][0-9]|3[0-1])\/(0[1-9]|1[0-2])\/[0-9]{4}

您可以决定需要哪些格式,并创建一个正则表达式,用OR运算符分隔格式|.

cgvd09ve

cgvd09ve5#

function myFunction() {
    var str = "Teen.Wolf.Orphaned.28.07.2014.HDTV";
    var res = str.split(".");

    var text = "";
    var x;
    for (x in res) {
        if (!isNaN(res[x])) {
            text += res[x];
            if (text.length == 2) { text += ','} 
            else if (text.length == 5) { text += ',' } 
        }
    }

    document.write(text);
}

这里会写“2014年7月28日”
注意:只有当字符串的格式与你上面发布的格式相似时才使用这种方式。

rjjhvcjd

rjjhvcjd6#

我有一个类似的用例,我使用并改变了@lpg的答案以满足我的需要。我需要解析发票日期,将有各种日期格式。我包含了一个解析月份名称的选项。由于我住在比利时,大多数日期的格式是dd-mm-yyyy或dd-mmmm-yyyy,所以我认为日期很可能具有这种格式。很容易将正则表达式中的一部分交换为交换月份和天数。代码注解中包含了一些解释。
翻译月份名称也很容易。注意:在荷兰语中,我们不使用“2023年5月3日”的格式,所以我没有包括这一点。
最后我用了这个:

function parseStringedDate(d) {

  /*
  Valid separators => . - / *space* (dot dash slash and space)
  Detexted formats => 
  dd mm yyyy 
  d mm yyyy
  d m yyyy
  yyyy mm dd
  yyyy m d
  d mmmm yyyy
  mmmm d yyyy
  */

  // Object to map month names to numbers
  const monthsConfig = {
    "januari": 0,
    "februari": 1,
    "maart": 2,
    "april": 3,
    "mei": 4,
    "juni": 5,
    "juli": 6,
    "augustus": 7,
    "september": 8,
    "oktober": 9,
    "november": 10,
    "december": 11
  };

  var day, month, year, result, dateSplitted;

  // dd-mm-yyyy  || d-mm-yyyy || mm-dd-yyyy || m-d-yyyy || mm-d-yyyy || m-dd-yyyy
  result = d.match("[0-9]{1,2}([\-/ \.])[0-9]{1,2}[\-/ \.][0-9]{4}");
  if (null != result) {
    dateSplitted = result[0].split(result[1]);
    day = parseInt(dateSplitted[0]);
    month = parseInt(dateSplitted[1]) - 1;
    year = parseInt(dateSplitted[2]);
  }

  // yyyy-mm-dd || yyyy-mm-d || yyyy-m-dd || yyyy-m-d || yyyy-mm-d || yyyy-dd-m || yyyy-d-mm
  result = d.match("[0-9]{4}([\-/ \.])[0-9]{1,2}[\-/ \.][0-9]{1,2}");
  if (null != result) {
    dateSplitted = result[0].split(result[1]);
    day = dateSplitted[2];
    month = parseInt(dateSplitted[1]) - 1;
    year = dateSplitted[0];
  }

  // dd-mmmm-yyyy || d-mmmm-yyyy
  result = d.match("[0-9]{1,2}([\-/ \.])[a-zA-Z]{3,}[\-/ \.][0-9]{4}");
  if (null != result) {
    dateSplitted = result[0].split(result[1]);
    day = dateSplitted[0];
    month = monthsConfig[dateSplitted[1]]
    year = dateSplitted[2];
  }

  // mmmm-dd-yyyy
  result = d.match("[a-zA-Z]{3,}[\-/ \.][0-9]{1,2}([\-/ \.])[0-9]{4}");
  if (null != result) {
    dateSplitted = result[0].split(result[1]);
    month = monthsConfig[dateSplitted[0]]
    day = dateSplitted[1];
    year = dateSplitted[2];
  }

  day = parseInt(day)
  month = parseInt(month)
  year = parseInt(year)

  if (!day || month === undefined || !year) {
    throw new Error("Invalid date format...")
  }

  // If the month is larger then 11, it is not a month, but a day for sure. Swap variables...
  if (month > 11) {
    let aux
    aux = day;
    day = month;
    month = aux;
    month-- // what was tought to be a day, was actually a month, so we need to substract 1, as months are zero based.
    day++   // restore the day, we accidently changed the day -1 in the previous code because we tought it was a month.
  }

  const jsDate = new Date(year, month, day)

  if (!jsDate instanceof Date) {
    throw new Error("Invalid date format...")
  }

  return jsDate.toISOString().split('T')[0]

}

相关问题