Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex yyyymmdd的正则表达式,以匹配单词中的某个匹配项_Regex_Vb.net - Fatal编程技术网

Regex yyyymmdd的正则表达式,以匹配单词中的某个匹配项

Regex yyyymmdd的正则表达式,以匹配单词中的某个匹配项,regex,vb.net,Regex,Vb.net,我一直在努力做到这一点,但似乎没有什么能达到我想要的。我的要求很简单。我有一行这样的文字 Your registration number is 201505260A61AIK01 此行包含格式为yyyymmdd的日期20150526。现在提到的这一行是文本文件中许多行中的一行。我正在寻找一种方法来检查文本行是否包含YYYYMMDD模式,然后检索完整的行。我发现了几十个正则表达式,但它们都不起作用。例如,下面的正则表达式 ^(?:(?:(?:(?:[13579][26]|[2468][048

我一直在努力做到这一点,但似乎没有什么能达到我想要的。我的要求很简单。我有一行这样的文字

Your registration number is 201505260A61AIK01
此行包含格式为yyyymmdd的日期20150526。现在提到的这一行是文本文件中许多行中的一行。我正在寻找一种方法来检查文本行是否包含YYYYMMDD模式,然后检索完整的行。我发现了几十个正则表达式,但它们都不起作用。例如,下面的正则表达式

 ^(?:(?:(?:(?:[13579][26]|[2468][048])00)|(?:[0-9]{2}(?:(?:[13579][26])|(?:[2468][048]|0[48]))))(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:0[1-9]|1[0-9]|2[0-9]))))|(?:[0-9]{4}(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:[01][0-9]|2[0-8]))))$
当字符串为

Your registration number is 20150526
但不是,

Your registration number is 201505260A61AIK01

我已经搜索了很多,如果发现这是另一个问题的重复,我会感到惊讶,因为我没有找到任何问题。

只需删除最后的
$

 ^(?:(?:(?:(?:[13579][26]|[2468][048])00)|(?:[0-9]{2}(?:(?:[13579][26])|(?:[2468][048]|0[48]))))(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:0[1-9]|1[0-9]|2[0-9]))))|(?:[0-9]{4}(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:[01][0-9]|2[0-8]))))

如果您坚持使用长正则表达式来验证datetime值并在更长的字符串中匹配它,则需要删除开始/结束锚定:

(?:(?:(?:(?:[13579][26]|[2468][048])00)|(?:[0-9]{2}(?:(?:[13579][26])|(?:[2468][048]|0[48]))))(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:0[1-9]|1[0-9]|2[0-9]))))|(?:[0-9]{4}(?:(?:(?:09|04|06|11)(?:0[1-9]|1[0-9]|2[0-9]|30))|(?:(?:01|03|05|07|08|10|12)(?:0[1-9]|1[0-9]|2[0-9]|3[01]))|(?:02(?:[01][0-9]|2[0-8]))))

但是,在处理日期时间值时,可以使用更简单的方法:匹配与日期时间值非常相似的数字,然后尝试解析它们。正则表达式变得可维护且可读:

(?<year>(?:20|19)\d{2})(?<month>\d{2})(?<day>\d{2})
看。如果我们知道字符串中有一个潜在的日期时间,它将对我们起作用。然后,使用
DateTime.Parse

Dim str As String ' First extract the string
str = Regex.Match(input, "(?<year>(?:20|19)\d{2})(?<month>\d{2})(?<day>\d{2})").Value
Dim dt As DateTime
Dim ok As Boolean = DateTime.TryParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture, Globalization.DateTimeStyles.None, dt)
Dim str As String'首先提取字符串
str=Regex.Match(输入,“(?(?:20 | 19)\d{2})(?\d{2})(?\d{2})”).Value
Dim dt作为日期时间
Dim ok作为布尔值=DateTime.TryParseExact(str,“yyyyMMdd”,System.Globalization.CultureInfo.InvariantCulture,Globalization.datetimestyle.None,dt)

如果
ok
True
(即,如果解析成功),
dt
变量将包含
DateTime
详细信息。

从末尾移除
$
,从开头移除
^
。但是,您只需匹配前8位数字,然后尝试将其解析为
DateTime
。如果您要求日期模式位于word的开头,请将
^
替换为
\b
。@Ulugbek Umirov谢谢。模式主要是在开始,但我不确定是否找到了一条不在开始的线。会处理每种情况吗?如果模式可能在词的中间,那么,正如@ StrubZeHEV所说的,你必须完全删除<代码> ^ < /代码>。如果模式总是在单词的开头,那么您必须将
^
替换为
\b
@Andrea Salicetti感谢哇这么简单的事情,我花了这么多时间在这上面。非常感谢您指出这一点。我什么也没偷,先生,我精通regexp,正如您所知,只有一个正确的答案。在我发布我的答案后,我诚实地阅读了你的答案…为什么要将错误或糟糕的答案标记为正确?我会再三考虑,不接受答案要2分。冷静点。每个人都指出了我在正则表达式中遇到的相同问题。一切都好。我不知道这个问题到底是什么,但因为这个答案是唯一可用的答案,解决了我的问题,所以我不得不接受它。或者,如果有更好的解决方案,那么我可以接受这个答案。我认为这不是什么大问题。谢谢大家。我很快就会发我的。我很惊讶。你写的第二个类似正则表达式的语句是什么?无论我在哪里找到了date的regex,它都非常长。这看起来很短,我喜欢这样,因为我只需要一个匹配,不想提取日期并解析它。
Dim str As String ' First extract the string
str = Regex.Match(input, "(?<year>(?:20|19)\d{2})(?<month>\d{2})(?<day>\d{2})").Value
Dim dt As DateTime
Dim ok As Boolean = DateTime.TryParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture, Globalization.DateTimeStyles.None, dt)