使用正则表达式根据条件获取字符串的一部分

Get part of a string based on conditions using regex

我这辈子都想不出正则表达式字符的组合来解析我想要的字符串部分。该字符串是 for 循环的一部分,给出一行 40 万行(无序)。我通过与数组 for 循环传递的唯一数字匹配找到的字符串。

我试图为每个字符串获取日期编号(例如下面的 20151212)。

给定以下字符串示例(从包含 400k++ 行字符串的 CSV 文件中提取):

字符串 1:

314513,,Jr.,John,Doe,652622,U51523144,,20151212,A,,,,,,,

字符串 2:

365422,johnd@blankity.com,John,Doe.,Jr,987235,U23481,z725432,20160221,,,,,,,,

字符串 3:

6231,,,,31248,U51523144,,,CB,,,,,,,

这里有几个并发症...

  1. 有些名字中有一个“,”,所以它超过了 15 个逗号。

  2. 我们不知道日期的值,只知道是(get-date).tostring("yyyyMMdd")

  3. 这样的日期格式

对于那些能想到更好的方法的人...

我们得到了两个要匹配的 CSV 文件。算法步骤:

我乐于接受建议(包括使用 Import-Csv cmdlet,其中我还不熟悉具有这些值的 for 循环的标志和语法)。

您可以尝试这样的操作:

,(19|20)[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01]),

这将匹配从 1900 到 2099 的给定格式的所有日期。它也足够具体以排除大多数其他随机数,尽管没有更大的数据样本,这是不可能的。

然后在 PowerShell 中:

gc data.csv | where { $_ -match ",((19|20)[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])),"} | % { $matches[1] }

在 PowerShell 匹配中,我们在我们想要的内容周围添加了捕获括号,并通过 $matches 索引中的组编号引用该组。

如果您只对根据前面的 ID 匹配一行感兴趣,您可以使用回顾。例如,

 $id=314513; # Or maybe U23481
 gc c:\temp\reg.txt | where { $_ -match "(?<=$id.*),((19|20)[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])),"} | % { $matches[1] }