【问题标题】:JScript Regex - extract dates preceded by substringsJScript Regex - 提取以子字符串开头的日期
【发布时间】:2020-11-08 09:26:46
【问题描述】:

我有一个包含多个日期的单行字符串。在 JScript Regex 中,我需要以给定的顺序提取由“dat”和“wy”的不区分大小写的子字符串处理的日期。子字符串前后可以有任何字符(换行除外)。

reg = new RegExp('dat.{0,}wy.{0,}\\d{1,4}([\-/ \.])\\d{1,2}([\-/ \.])\\d{1,4}','ig');
str = ('abc18.Dat   wy.03/12/2019FFF*Dato dost2009/03/03**data wy2020-09-30')
result = str.match(reg).toString()

Received result: 'Dat   wy.03/12/2019FFF*Dato dost2009/03/03**data wy2020-09-30'
Expected result: 'Dat   wy.03/12/2019,data wy2020-09-30' or preferably: '03/12/2019,2020-09-30' 

谢谢。

【问题讨论】:

  • 请清楚地向我们展示所有可能出现在输入中的日期格式。
  • YYYYMMDD、DDMMYYYY 或 MMDDYYYY 以 -/ 分隔。即连字符、斜线或点。正则表达式('\\d{1,4}([\-/ \.])\\d{1,2}([\-/ \.])\\d{1,4}','ig' ) 查找我需要的日期,问题在于查找以子字符串开头的日期。

标签: regex jscript


【解决方案1】:

几个问题。

  1. 您希望尽可能少地匹配子字符串和日期,但您当前的正则表达式使用greed .{0,}(与.* 相同)。请参阅 this Question 并改用 .*?
  2. dat.*?wy.*?FOO 仍然可以跳过任何其他 dat。为避免跳过,请使用一些人所说的 Tempered Greedy Token.*? 变为 (?:(?!dat).)*? 表示不跳过。
  3. 不是真正的问题,但您可以capture 日期分隔符和reuse 它。

如果您只想提取日期部分,也可以使用捕获组。我放了一个demo at regex101

dat(?:(?!dat).)*?wy.*?(\d{1,4}([/ .-])\d{1,2}\2\d{1,4})

有很多方法可以实现您想要的结果。另一个想法,我会想到 - 如果你知道,日期之间永远不会出现任何数字,use \D for non-digit instead of the .

dat\D*?wy\D*(\d{1,4}([/ .-])\d{1,2}\2\d{1,4})

【讨论】:

  • 谢谢。我试过 RegExp('dat.*?wy.*?\\d{1,4}([\-/ \.])\\d{1,2}([\-/ \.])\ \d{1,4}','ig') 并且它仍然导致'Dat wy.03/12/2019,Dato dost2009/03/03**data wy2020-09-30' 我需要得到'Dat wy.03/12/2019,data wy2020-09-30' 或最好:'03/12/2019,2020-09-30'
  • @PrzemyslawWojda 见this demo
  • 还有一件事 - 如何调整它(我使用 "dat(?:(?!dat).)*?wy.*?")来匹配子字符串 "dat" 和 "wy"还是“dat”和“do”?
  • @PrzemyslawWojda 替换 wy with (?:wy|do) 。如果它适用于您的输入,也请尝试the second solution。它更快,更受欢迎。
  • 两者都有效,第二个确实更快。再次感谢你!这是一个非常强大的工具。
【解决方案2】:

您可以使用带有反向引用的捕获组来确保-/ 等分隔符在匹配日期中相同。

\bdat\w*\s*wy\.?(\d{4}([-/ .])\d{2}\2\d{2}|\d{2}([-/ .])\d{2}\3\d{4})
  • \bdat\w*\s*wy\.? 一个单词边界,匹配 dat 后跟 0+ 个单词字符和 0+ 个空白字符。然后匹配 wy 和可选的 .
  • ( 捕获第 1 组
    • \d{4}([-/ .])\d{2}\2\d{2} 匹配以年份开头的日期格式,其中 \2 是对第 2 组中捕获的内容的反向引用
    • |或者
    • \d{2}([-/ .])\d{2}\3\d{4} 匹配以年份结尾的日期格式,其中\3 是对第 3 组中捕获的内容的反向引用
  • )关闭群

该值在捕获组 1 中

Regex demo

注意您可以将日期 more specific 指定为年、月和日的范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 2019-08-06
    • 2017-12-10
    • 2014-07-09
    • 2019-03-06
    • 1970-01-01
    • 2019-12-22
    • 2023-01-07
    相关资源
    最近更新 更多