查找一系列行的 C# 正则表达式模式匹配 [已关闭]

Looking for a C# Regex pattern matching for a series of lines [closed]

提问人:Nick Ulrich 提问时间:9/16/2022 最后编辑:EnigmativityNick Ulrich 更新时间:9/16/2022 访问量:56

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

去年关闭。

我看到一个数据文件,在文件中我有一行需要匹配,然后我会阅读接下来的几行,直到我再次找到这个匹配项。

以下是我需要匹配的线的各种结构:

69 1.0 PKS-EKC-FlYCTRK--Y 2,110.28 2,110.28
70 2.0 ACS-PMM 31.75 63.50
72 1.0 PKS-TR1-CRD 308.14 308.14
73 1.0 QTC-01HZZ-RBER058- 1,725.57 1,725.57
74 1.0 MGS-05B-4TC-120--8 1,222.84 1,222.84
75 1.0 ACS-VGY 98.60 98.60
76 2.0 ACS-VGG 27.27 54.53
77 2.0 ACS-VGQ 110.93 221.86
78 2.0 ECS-ENM--845 1,294.18 2,588.36
80 1.0 FREIGHT 4,188.00 4,188.00

这是我到目前为止想到的,但它只匹配一行,我需要匹配所有行。

(\d{2})\s(\d{1}.\d{1})\s(\w+?-\w+?-\w+?--\w)\s(\d+?,\d+.\d+)\s(\d+?,\d+.\d+)
C# 正则表达式 匹配

评论

0赞 9/16/2022
你能逃脱一些超级简单的东西吗?有哪些您不想匹配的线条示例?^(\S+)\s(\S+)\s(\S+)\s(\S+)\s(\S+)$
1赞 41686d6564 9/16/2022
{1}总是多余的,不会做你似乎认为它做的事情。+?
1赞 41686d6564 9/16/2022
现在,您并没有真正解释控制这些行结构的规则,但也许这是一个好的开始:.演示:regex101.com/r/c9e0fv/1^(\d{2})\s(\d.\d)\s(\w+(?:-+\w+)*(?:--\w)?-?)\s((?:\d+,)?\d+.\d+)\s((?:\d+,)?\d+.\d+)$
1赞 bobble bubble 9/16/2022
对于这个输入,我会使用例如: ^(\d\d)\s(\d.\d)\s([\w-]+)+\s(\b[\d.,]+)\s(\b[\d.,]+)$ - 许多解决方案,都取决于匹配精度:)
0赞 tymtam 9/16/2022
你能举出这不应该匹配的几行的例子吗?

答:

1赞 tymtam 9/16/2022 #1

您可以像这样检查这些行:

bool IsThisIt(string line)
{
    var parts = line.Split(' ');

    if(parts.Length != 5) return false;

    // Number
    if(!int.TryParse(parts[0], out var _)) return false;

    // Type
    if(!decimal.TryParse(parts[1], out var _)) return false;
    

    // Price 1 
    if(!decimal.TryParse(parts[3], out var _)) return false;

    // Price 2
    if(!decimal.TryParse(parts[4], out var _)) return false;

    return true;
}
0赞 M.Sqrl 9/16/2022 #2

我喜欢一个好的正则表达式问题。解决!

^(\d{2})\s(\d\.\d)\s(\S*)\s((\d*\,\d*.\d{2})|(\d*.\d{2}))\s((\d*\,\d*.\d{2})|(\d*.\d{2}))$

开头总是有两位数字:

^(\d{2})

后跟一位小数的数字:

(\d\.\d)

后跟一些非空格字符字符串:

(\S*)

使用 OR 处理不同的数值结构:

((\d*\,\d*.\d{2})|(\d*.\d{2}))

regex101.com 是你的朋友。

评论

0赞 Nick Ulrich 9/17/2022
谢谢大家。这些答案很棒!