【问题标题】:Extracting text with no consecutive whitespaces [duplicate]提取没有连续空格的文本[重复]
【发布时间】:2021-03-30 20:38:00
【问题描述】:

我在下面有一个示例输入,我想使用正则表达式提取每个单独的列,但它不能用于多个连续的空格。我试过了 “([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

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

  • “1”表示“输出模块”。
  • “2”表示“端口”
  • “类型”的“CCS-7354 系列管理模块”。
  • “7354-SPP”用于模型。
  • “序列号”为“JD546546527”

我收到“CCS-7354 Series Supervisor Module 7354-SPP ”的类型不正确。

【问题讨论】:

  • 为什么不只计算第 3 行的破折号,然后使用计数检索列?然后你只需要修剪空白。然后,您可以使用正则表达式验证每个结果字符串。分而治之。
  • 或者您可以多次执行以下正则表达式(使用 find):(.+?)(?:\s{2,}|$) for each line...
  • @tripleee "我想使用正则表达式提取每个单独的列" -- 你为什么选择一个非正则表达式的重复答案?
  • 小仙女;我添加了另一个副本。
  • @Jojoleo 你的问题已经回答了吗?

标签: regex replace


【解决方案1】:

您的问题是类型列匹配组[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]+)

在这里测试:link

当然,还有其他方法可以编写正则表达式,这样您就不需要使用不情愿的匹配语法。例如((?:\S|\s\S)+)

这匹配最多由一个空格字符分隔的非空格字符。

综合起来就是:([0-9])\s+([0-9])\s+((?:\S|\s\S)+)\s+((?:\S|\s\S)+)\s+((?:\S|\s\S)+)

以这种方式编写它可以减少潜在的回溯量,因此无论输入如何,都应该会产生始终如一的快速正则表达式(尽管使用这种简单的输入,它似乎会稍微慢一些)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 2021-06-17
    • 2021-09-15
    • 2014-01-29
    • 2021-02-05
    • 2014-09-17
    • 2016-07-31
    相关资源
    最近更新 更多