Powershell:使用正则表达式匹配模式及其变体(具有特殊字符)

时间:2017-10-26 01:09:32

标签: regex powershell

我有几千个包含表单信息的文本文件(每个表单一个文本文件),包括每个表单的唯一ID。

我一直在尝试使用正则表达式(我不太熟悉)提取表单ID,以匹配在表单ID之前和之后找到的字符串,并仅提取它们之间的表单ID号。通常文字如下:“... 12 ID 12345678 独立董事会......”

粗体8位数字是我需要提取的表格ID。

我使用的代码如下所示:

$id= ([regex]::Match($text_file, "12 ID (.+) INDEPENDENT").Groups[1].Value)

这很好用,但我很快就注意到有些文件对这个脚本不起作用。经过调查,我发现文本中还有另一个变体,其中包含一些文本文件使用的表单ID。这种变化如下:“...... 12 ID 12345678 (a.12(3)(b),45)......”

所以我的第一个挑战是弄清楚如何更改脚本以使其匹配第一个或第二个模式。我的第二个挑战是逃避“(a.12(3)(b),45)”中的所有特殊人物。

我知道管道在正则表达式中用作“或”,两个反斜杠用于转义特殊字符,但下面的代码给出了错误:

$id= ([regex]::Match($text_one_line, "34 PR (.+) INDEPENDENT"|"34 PR (.+) //(a//.12//(3//)//(b//)//,45//)").Groups[1].Value)

我在哪里出错以及如何修复我的代码?

谢谢!

1 个答案:

答案 0 :(得分:2)

当你接近正则表达式时,总是寻找固定与可变部分。 在您的情况下,ID似乎是固定的,因此它可用作参考点。

以下模式适用于此建议:(?:ID\s+)(\d{8})
(点击图案进行解释)。

$str = "... 12 ID 12345678 INDEPENDENT BOARD..."
$ret = [Regex]::Matches($str, "(?:ID\s+)(\d{8})")
for($i = 0; $i -lt $ret.Count; $i++) {
    $ret[0].Groups[1].Value
}

请考虑将Stack Overflow Regular Expressions FAQ加入书签以供将来参考。它包含了大量有用信息。