gpt4 book ai didi

c# - 解析字符串 - 有比检查每一行更有效的方法吗?

转载 作者:行者123 更新时间:2023-11-30 18:39:44 30 4
gpt4 key购买 nike

我正在从事一个解析文本文件的项目。该文件是从网络设备输出的。传入字符串的长度从几千行到几万行不等。将有数量可变的条目,这些关键字包含以下关键字:

fcN/N is up
Hardware is Fibre Channel, SFP is short wave laser w/o OFC (SN)
Port WWN is 20:52:00:0d:ec:ef:b0:40
Admin port mode is F, trunk mode is on
snmp link state traps are enabled
Port vsan is 10

fcipN is up
.....

port-channel-N is trunking
......

N 是一个数字。总会有 'fcN/N' 条目,可能有也可能没有其他两个。 'fcip' 和 'port-channel' 条目将在每个条目之后具有与 fcN/N 条目相似的状态信息。相同类型的所有条目将被分组 - 不会有 fc 后跟 fcip 后跟另一个 fc。同样作为一般规则,列出所有 fc 条目,然后是所有端口 channel ,然后是所有 fcip,但我不想假设。目前我正在寻找大约 7 种不同的 RegEx 模式。我通过依次检查每一行来做到这一点,但是管理所有这些很麻烦。我考虑过在换行符上拆分字符串,然后使用某种 LINQ 选择来获取所有 3 种类型的条目中的每一种,但这假设它们总是以相同的顺序分组。我还考虑了 3 个怪异的正则表达式来匹配从一个条目到下一个条目的所有内容,但我的经验是这些很难开始工作并且几乎不可读。我想到的另一件事是首先匹配三个关键字 - fc 或 port-channel 或 fcip,然后有一个 if 语句匹配那些唯一的模式。尽管如此,这仍然匹配所有 3 种模式的每一行。

需要说明的是,我使用了 Regex 模式。我正在寻找一种比测试每行 6 0r 8 个匹配项更有效的方法。

还有其他想法吗?

最佳答案

我有两个想法:

(1) 您使用 if 语句首先找到要应用的正确正则表达式的最后一种方法似乎非常有效。我会推荐它。

(2) 您可以像这样编写正则表达式:

var pattern1 = @"abc";
var pattern2 = @"def";
var unionPattern = "((" + pattern1 + ")|(" + pattern2 + "))";

这使它更具可读性。

如果您永远不想找到跨行的匹配项,您应该先将文件拆分为多行。这将提高效率,因为正则表达式的输入更小,回溯更少。

如果你的匹配跨越多行,但它们总是在换行之后开始,你可以先将字符串拆分成 block ,如下所示:

var chunks = Regex.Split(str, "((fc\d)|(fcip\d)|(port-channel-\d)));

关于c# - 解析字符串 - 有比检查每一行更有效的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9240634/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com