下面有一个示例输入,我希望使用regex提取每个单独的列,但是它不能工作在多个连续的空格中。我尝试过"([0-9])\s+([0-9])\s+([A-Za-z0-9- ]+)\s{2,}([A-Za-z0-9- ]+)\s+([A-Za-z0-9]+)“,它应该适用于每一行。
Output
Module Ports Type Model Serial No.
--------- ----- ------------------------------------ --------------- -----------
1 2 CCS-7354 Series Supervisor Module 7354-SPP JD546546527
2 1 Standby supervisor Unknown Unknown
3 28 28-port SFP+ 10GigE Linecard 7234S-PC FGK10449938对于输入结果的第一行,我应该得到:
我得到的类型"CCS-7354 Series Supervisor Module 7354-SPP“是不正确的。
发布于 2020-12-21 03:33:55
您的问题是类型列匹配组[A-Za-z0-9- ]+使用“贪婪”匹配。
相反,您应该将其更改为“勉强”匹配的[A-Za-z0-9- ]+?。
同样,之后的Model列匹配组也应该更改为不情愿的匹配,而不是贪婪的匹配,这样它就不会抢先吃掉所有的尾随空间。
这是最后的正则表达式-- ([0-9])\s+([0-9])\s+([A-Za-z0-9- ]+?)\s{2,}([A-Za-z0-9- ]+?)\s+([A-Za-z0-9]+)
这里的测试:链接
当然,还有其他方法可以编写regex,这样就不需要使用不情愿的匹配语法。例如,((?:\S|\s\S)+)
这将匹配由最多一个空格字符分隔的非空格字符。
把所有这些放在一起,就会是:([0-9])\s+([0-9])\s+((?:\S|\s\S)+)\s+((?:\S|\s\S)+)\s+((?:\S|\s\S)+)
以这种方式编写它可以减少潜在的回溯量,因此应该会导致一致的快速正则表达式,而不管输入是什么(尽管使用这个简单的输入看起来稍微慢了一点)。
https://stackoverflow.com/questions/65386720
复制相似问题