【问题标题】:Capture number between two whitespaces (RegEx)捕获两个空格之间的数字 (RegEx)
【发布时间】:2016-12-06 16:00:23
【问题描述】:

我有以下数据:

SOMEDATA .test 01/45/12 2.50 THIS IS DATA

我想从中提取数字 2.50。我已经设法使用以下正则表达式做到这一点:

(?<=\d{2}\/\d{2}\/\d{2} )\d+.\d+ 

但是,这不适用于这样的输入:

SOMEDATA .test 01/45/12 2500 THIS IS DATA

在这种情况下,我想提取数字 2500。

我似乎无法为此找到一个正则表达式规则。有没有办法在两个空格之间提取一些东西?那么在日期之后提取文本/数字直到下一个空格?我所知道的是,日期将始终具有相同的格式,并且在文本之后总会有一个空格,然后在我要提取的数字之后有一个空格。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您的行中是否有文字 THIS IS DATA
  • @SebastianProske 完美运行。非常感谢。你能解释一下你在那里用 \d+(.\d+) 做什么吗?
  • @user2606751:请参阅我对当前答案的评论。要点是您的正则表达式不“正确”,因为点未转义。您需要按照 Dmitry 显示的方式使用它,否则您将无法匹配 1 位数的值,例如 SOMEDATA .test 01/45/12 2 THIS IS DATA
  • 或者你确定你发布了你正在使用的确切模式?

标签: regex extract whitespace


【解决方案1】:

捕获两个空格之间的数字

空格与\s匹配,非空格与\S匹配。

那么,你可以使用的是:

\d{2}\/\d{2}\/\d{2} +(\S+)
                      ^^^

regex demo

1+ 个非空白符号被捕获到第 1 组中。

如果 - 由于某种原因 - 您只需要获取整个匹配的值,请使用您的后视方法:

(?<=\d{2}\/\d{2}\/\d{2} )\S+

或者 - 如果您使用 PCRE - 您可以利用匹配重置运算符\K

\d{2}\/\d{2}\/\d{2} +\K\S+
                     ^^

another demo

注意\K 和捕获组方法允许日期后有 1 个或多个空格,因此更加灵活。

【讨论】:

    【解决方案2】:

    我看到有些人已经帮助了你,但如果你出于某种原因想要一个替代的工作,这也是可行的:)

    .+ \d+\/\d+\/\d+ (\d+[\.\d]*)
    

    所以 .+ 匹配任何内容加上第一个空格 那么 \d+/\d+/\d+ 是日期解析加上一个空格 捕获组是数字,如您所见,我将最后一部分设为可选,因此浮点值和普通值都可以匹配。希望这有帮助!

    证明:https://regex101.com/r/fY3nJ2/1

    【讨论】:

      【解决方案3】:

      只需将分形部分设为可选:

      (?<=\d{2}\/\d{2}\/\d{2} )\d+(?:\.\d+)?
      

      演示:https://regex101.com/r/jH3pU7/1

      更新 cmets 中的以下说明:

      要匹配由空格包围并以日期开头的任何内容(除了空格):

      (?<=\d{2}\/\d{2}\/\d{2} )\S+
      

      演示:https://regex101.com/r/jH3pU7/3

      【讨论】:

      • 要点是 OP 有一个未转义的 . 匹配除换行符以外的任何符号。如果使用(?&lt;=\d{2}\/\d{2}\/\d{2} )\d+.\d+,则无需使用该可选组。但是,肯定必须对点进行转义并使用可选组。 :)
      • @WiktorStribiżew 我们能否找到一个解决方案,将日期之后的所有内容提取到下一个空格?无论文本点或逗号或其他任何内容是什么?
      【解决方案4】:

      除了捕获之外,您还可以通过向后看使整个匹配成为目标文本:

      (?<=\d\d(\/\d\d){2} )\S+
      

      这与“日期类似”部分之后的第一系列非空白字符匹配。

      还要注意“日期喜欢”模式的长度减少。您可以考虑在您使用的任何解决方案中使用这部分正则表达式。

      【讨论】:

        猜你喜欢
        • 2017-05-10
        • 2019-06-19
        • 2012-11-06
        • 2016-06-10
        • 1970-01-01
        • 2015-07-22
        • 2018-04-29
        • 1970-01-01
        • 2015-06-24
        相关资源
        最近更新 更多