首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提取没有连续空白的文本

提取没有连续空白的文本
EN

Stack Overflow用户
提问于 2020-12-21 02:06:20
回答 1查看 76关注 0票数 0

下面有一个示例输入,我希望使用regex提取每个单独的列,但是它不能工作在多个连续的空格中。我尝试过"([0-9])\s+([0-9])\s+([A-Za-z0-9- ]+)\s{2,}([A-Za-z0-9- ]+)\s+([A-Za-z0-9]+)“,它应该适用于每一行。

代码语言:javascript
复制
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

对于输入结果的第一行,我应该得到:

  • "1“表示”输出模块“。
  • "2“代表”港口“
  • CCS-7354系列监控器模块,用于“型号”。
  • "7354-SPP“为模型。
  • "JD546546527“表示”系列编号“

我得到的类型"CCS-7354 Series Supervisor Module 7354-SPP“是不正确的。

EN

回答 1

Stack Overflow用户

发布于 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)+)

以这种方式编写它可以减少潜在的回溯量,因此应该会导致一致的快速正则表达式,而不管输入是什么(尽管使用这个简单的输入看起来稍微慢了一点)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65386720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档