将多条线匹配到另一条线
本文关键字:一条 | 更新日期: 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,})
(还在表达式中添加了m
和s
标志。)
这不是很有效的tho,因为正则表达式引擎可能需要扫描大部分字符串以查找每个匹配项。