Regex 从字符串中提取每个唯一的数据

Regex 从字符串中提取每个唯一的数据,regex,Regex,我一直在尝试设置正则表达式提取过程,但没有成功 我有一组日期值,格式如下。我需要能够提取这些独特的个人日期 如果只有一个值,则为mm/dd/yyyy的标准简单格式。那个很简单 如果有多个日期值,则其格式如下: 2016年2月5日、12日、19日、26日、3月4日、11日 我需要将其转换为2016年5月2日、2016年12月2日等 最后,我将把这些日期插入数据库 我是不是走错了路?感谢您的建议。假设您正在注册的数据中没有任何偏差或异常,可以在设置大小写敏感度的情况下应用以下正则表达式,并允许您访问

我一直在尝试设置正则表达式提取过程,但没有成功

我有一组日期值,格式如下。我需要能够提取这些独特的个人日期

如果只有一个值,则为mm/dd/yyyy的标准简单格式。那个很简单

如果有多个日期值,则其格式如下: 2016年2月5日、12日、19日、26日、3月4日、11日

我需要将其转换为2016年5月2日、2016年12月2日等

最后,我将把这些日期插入数据库


我是不是走错了路?感谢您的建议。

假设您正在注册的数据中没有任何偏差或异常,可以在设置大小写敏感度的情况下应用以下正则表达式,并允许您访问所需的信息。对于正则表达式,重要的是“了解您的数据”,因为这个变量可以极大地改变正则表达式的构造——特异性和清晰性之间的平衡很重要,因为正则表达式很容易变得笨拙和神秘

将月份另存为:
([A-Z][A-Z][A-Z])
//这可以是$1变量(以后有用)

将日期值另存为:
\s*(?:([0-9]?[0-9]),\s)*
/$2变量应可用于访问此值列表

将年份值另存为:
([0-9]{4,4})
/$3变量应可用于访问这些值注意:这仅适用于设计为#####格式的日期,尽管可以更改以处理不同的格式;我只是从你提供的例子说起

把它们串在一起你会得到:
(?:([A-Z][A-Z][A-Z])\s*(?:([0-9]?[0-9]),\s)*+([0-9]{4,4})


然后可以用这些值构造对象,这样就不会产生一堆混乱的数据。如果我正确地解决了您的问题,请告诉我。如果我遗漏了什么,或者您忘记了提及一些附加功能,我将很乐意提供帮助。

如果您尝试使用一个正则表达式来完成,这将是一个完整的意大利面条:

  • 你必须在某处硬编码月份的名称和相应的数字
  • 年份不在月份的天数列表之后,而是在所有月份名称的列表之后——今年的月份天数
然而,在普通编程语言的帮助下,您仍然可以得到一个简短的、以regex为中心的解决方案。下面是一个小的Ruby片段,展示了它的基本思想:

# this is the input
dates = "Feb 5, 12, 19, 26, Mar 4, 11 2016, Jul 5, 7, 19, 26, May 4, 11 2017"

# a hash with month name => month number
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',
}

# match and extract three things:
#  month - the first found month name (three letters)
#  days  - list of days separated by commas and spaces for this month
#           for example 5, 12, 19, 26, 
#  year  - the first found year (four digits)
# ,? is because we don't have , after the last day of the year
while dates =~ /(\w{3}) ((?:\d\d?,? )+).*?(\d{4})/
  month, days, year = $1, $2, $3
  # to each day collate a date in the wanted format
  #  MONTHS[month] gets the month number from the hash above
  #  sprintf simply makes sure that one digit days will have a leading 0
  dates_this_month = days.split(/,? /).map do |day|
    "#{MONTHS[month]}/#{sprintf('%02d', day)}/#{year}"
  end.join ', '
  # substitute the dates for this month with the new format
  dates.sub! "#{month} #{days}", "#{dates_this_month}, "
end

# remove leftover years
dates.gsub! /, \d{4}/, ''

现在,
日期
是所需格式。

1。单靠正则表达式无法完成这项工作,您很可能需要一种编程语言。2.我将解析输入,而不是将其正则化。我感谢乔纳森。数据是来自提要的原始数据。我知道这并不理想。