Powershell/Regex/EDI 的新手。请不要评论为什么不应该使用 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+) 更清洁的方法,我完全赞成。
谢谢