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

时间:2015-12-11 02:06:26

标签: regex powershell powershell-v3.0

对于我的生活,我无法弄清楚用于解析我想要的字符串部分的正则表达式字符的组合。该字符串是for循环的一部分,给出了40万行(乱序)。我通过匹配数组for循环传递的唯一数字找到的字符串。

对于每个字符串,我正在尝试获取日期编号(例如下面的20151212)。

给出以下字符串示例(从具有400k ++字符串行的CSV文件中提取):

字符串1:

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

String2的:

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

STRING3:

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

这里有几个并发症......

  1. 有些名称中包含“,”,因此它会超过15个逗号。

  2. 我们不知道日期的价值,只是它是一种日期格式,例如(get-date).tostring("yyyyMMdd")

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

    我们有两个匹配的CSV文件。算法步骤:

    • 在CSV文件1中查找ID号(在第2列中找到)

      **对于CSV文件1

    • ,无ID号将为空白
    • 查看CSV文件2并匹配CSV文件中的ID号1.在同一行中,获取日期。一旦有了日期,请在CSV文件1的第5列附加与ID号

      相同的行

      **注意:对于ID中的某些值,CSV文件2将具有$ null 编号栏

    我愿意接受建议(包括使用Import-Csv cmdlet,其中我不熟悉for循环的标志和语法,但这些值仍然存在。)

1 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

,(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匹配一行,则可以使用lookbehind。例如,

 $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] }