gpt4 book ai didi

regex - 将匹配 YYMMDD 但不匹配更长数字的 bash 正则表达式

转载 作者:行者123 更新时间:2023-12-05 06:39:14 26 4
gpt4 key购买 nike

一般问题

我试图了解在编写正则表达式时如何防止某些模式在寻找到的模式之前或之后存在!

一个更具体的例子

我正在寻找一个匹配 YYMMDD 格式日期的正则表达式 ((([0-9]{2})(0[1-9]|1[0-2])(0 [1-9]|[1-2][0-9]|3[0-1]))) 在长字符串中,同时忽略较长的数字序列

它应该能够匹配:

  • text151124moretext
  • 123text151124moretext
  • text151124
  • text151124moretext1944
  • 151124

但应该忽略:

  • text15112412moretext(原因:它有 8 个数字而不是 6 个)
  • 151324(原因:YYMMDD 不是有效日期 - 没有第 13 个月)

我如何确保如果一个数字的超过这 6 位数字,它不会在一个正则表达式中被选为日期(意思是,我宁愿避免预处理字符串)我想到了 \D((19|20)([0-9]{2})(0[1-9]|1[0-2])(0[1-9]|[ 1-2][0-9]|3[0-1]))\D 但这是否意味着必须前后有一些字符?

我正在使用 bash 3.2 (ERE)

谢谢!

最佳答案

尝试:

#!/usr/bin/env bash

extract_date() {
local string="$1"
local _date=`echo "$string" | sed -E 's/.*[^0-9]([0-9]{6})[^0-9].*/\1/'`
#date -d $_date &> /dev/null # for Linux
date -jf '%y%m%d' $_date &> /dev/null # for MacOS
if [ $? -eq 0 ]; then
echo $_date
else
return 1
fi
}


extract_date text15111224moretext # ignore n_digits > 6
extract_date text151125moretext # take
extract_date text151132 # # ignore day 32
extract_date text151324moretext1944 # ignore month 13
extract_date text150931moretext1944 # ignore 31 Sept
extract_date 151126 # take

输出:

151125
151126

关于regex - 将匹配 YYMMDD 但不匹配更长数字的 bash 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44812906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com