将多条线匹配到另一条线

本文关键字:一条 | 更新日期: 2023-09-27 17:58:08

在尝试解析数据表时,学习了一些Regex,我认为没有一种简单的方法(在Regex中,我的意思是……在C#中,当然!)可以做到这一点。假设我有一个文件,行:

0000AA  One Token    -  Value
0000AA  Another Token-  Another Value
0000AA  YA Token     -  Yet Another
0000AA  Yes, Another -  Even More
0000AA
0000AA  ______________________________________________________________________
0000AA  This line - while it will match the regex, shouldn't.

所以我有一个简单的多行正则表达式:^'s*[A-Z]{2}[0-9]{4}'s's*(?<token>.*?)'-(?<value>.*?)$这会将所有"Tokens"加载到"token"中,并将所有值加载到"value"组中。很简单!但是,Regex也匹配底线,将"This line"放入令牌中,将"while it will[…]"放入值中。

从本质上讲,我希望regex只与____分隔符行上方的行匹配。这是否可以单独使用Regex,或者我需要首先将传入字符串修改为____分隔线上的.Split()?

干杯-
-迈克。

将多条线匹配到另一条线

仅使用regex解析这样的文本文件并不能为作业使用正确的工具。虽然可能,但这既低效又不必要地复杂。

实际上,我也不会将所有文本加载到一个字符串中并在这一行进行拆分,因为这不是最有效的方法。我宁愿一次一行地循环读取文件,根据需要处理每一行。然后,当您到达该特定行时停止处理。

我希望正则表达式只与____分隔符行上方的行匹配。只有Regex一个人能做到吗?

当然有可能。添加一个前瞻以确保后面有这样一行,类似于:

(?=(?s).*^'w{6}[ 't]+_{4,})

将其添加到表达式的末尾,以确保后面有这样一行。例如:

(?m)^'s*[A-Z]{2}[0-9]{4}'s's*(?<token>.*?)'-(?<value>.*)$(?=(?s).*^'w{6}[ 't]+_{4,})

(还在表达式中添加了ms标志。)

这不是很有效的tho,因为正则表达式引擎可能需要扫描大部分字符串以查找每个匹配项。