【问题标题】:Powershell Regex Pattern for EDIEDI 的 Powershell 正则表达式模式
【发布时间】:2012-10-23 08:22:12
【问题描述】:

Powershell/Regex/EDI 的新手。请不要告诉 cmets 为什么不应该使用 EDI 的正则表达式来完成,我已经看到了警告,但别无选择。

我需要的很可能是基本的,但我需要一些帮助。我必须找到一个段的所有实例,并从中检索一个特定的元素值。正在搜索的文本将被读取为一个长字符串,没有 CR/LF/等。

示例数据:

~SV1*HC:V2020*35*UN*1***1~DTP*472*D8*20120807~REF*6R*
~SV1*HC:V2100:LT*28.98*UN*1***1~DTP*472*D8*20120807~REF*6R*
~SV1*HC:92014*165*UN*1***1~DTP*472*D8*20120716~REF*6R*

我在另一个段上使用了以下命令,它的工作方式和我想要的一样,但它也不必考虑非单词字符:

Select-String -pattern '~svd\*\w+\*(\d+|\d+\.\d+)\*' -input $string -AllMatches | %{$_.Matches} | %{$_.Groups[1]} | %{$_.Value}

理想情况下,我想找到“~SV1*”的一个实例,跳到下一个星号,然后通过下一个星号阅读所有内容。这样,那里的字母/数字/字符无关紧要,它会跳过它。在上面的数据示例中,我希望返回 35、28.98、165。如果没有,那么我可以使用我所拥有的,但是匹配单词/非单词字符的组合让我很失望,因为我不知道它们可能存在的顺序。我玩过的其他所有东西都在继续拉弦的其余部分,并且没有正确停止。

如果我能做到这一点,我会很高兴:

~SV1*<skip this>*<get this>*<skip to next SV1>~SV1*<skip this>*<get this>*<skip to next SV1>

最后,被提取的数据是一个货币字段,所以它可能有也可能没有小数。如果有比 (\d+|\d+.\d+) 更干净的方式,我完全赞成。

谢谢

【问题讨论】:

    标签: regex powershell edi


    【解决方案1】:

    一个起点,但你需要测试它:

    Select-String -pattern '(?<=~sv\d\*.*\*)(\d*\.?\d+)(?=\*un)' -input $string -AllMatches | %{$_.Matches} | % {$_.Groups[1]} | %{$_.Value}
    

    使用您的示例数据返回 35、28.98、165。

    【讨论】:

    • 初始测试看起来不错。我会在今天晚些时候或周一回复,一旦我完成了它的步伐。在我丢失匹配项并获得较低数字之前,对所有这些值进行求和现在可以获得预期的结果。如果你不介意,你能给我一个快速分解的确切原因吗?尤其是 (?=*un)。谢谢!
    • @DavidJones (?regular-expressions.info/lookaround.html你可以找到很好的解释
    • 很好的资源,那里有很多很好的信息。您的示例还帮助我找到了其他一些我做错的事情,再次感谢!
    【解决方案2】:

    使用这样的模式:

     ~sv\d\*[^*]*\*([^*]*)\*
    

    【讨论】:

    • 这实际上更适合我的情况,因为我可以插入片段并获得我想要的结果,调整我想要跳过的元素的星号。谢谢!
    猜你喜欢
    • 2018-10-29
    • 2015-09-17
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2020-07-06
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多