【问题标题】:Regex - matching everything with number at the end正则表达式 - 将所有内容与最后的数字匹配
【发布时间】:2016-01-14 06:26:26
【问题描述】:

我有一个格式如下的输入:我们在字符串的开头有任意数量的空格,然后我们有一个可以是任何东西的数据子字符串,它以非空格字符开头和结尾。在数据之后,我们再次有任意数量的空格(至少一个),一个数字和空格......

这个规范确实不准确,我想知道如何匹配它。在末尾匹配开头和结尾的空格和数字显然相当容易。最终的正则表达式如下所示:R("\s*(X)\s+([0-9]+)\s*)" 其中(X) 是完全匹配所有内容的东西。但是我不确定这个(X) 应该是什么样子。如何解决这个问题?

还有一件事 - 如果正则表达式匹配整行,那么最后的数据和数字是我想要获取的东西,所以仅仅找到一个数字不是解决方案。

澄清:在最终的正则表达式中,我想将子字符串和最终数字作为两个正则表达式组。

【问题讨论】:

  • 这不是也匹配一个数字吗?我希望数据和数字是要匹配的单独数据“块”。
  • 这是一个 .* 不能按预期工作的数据示例:Foo234bar 456,然后我想抓取“Foo234bar”和“456”,这与“Foo234”匹配

标签: c++ regex


【解决方案1】:

你可以使用

^\s*(\S.*?)\s+([0-9]+)\s*$

意思:

  • 字符串开头^
  • 任意数量的空白字符\s*
  • 非空白\S
  • 任何东西,但不贪心.*?
  • 一个或多个空格字符\s+
  • 一个号码[0-9]+
  • 任意数量的空白字符\s*
  • 字符串结尾$

将修剪后的数据和数字保留为匹配结果

【讨论】:

  • \S.*\S - 即使有两个 \S,这个片段是否会匹配长度为 1 的数据? (例如,这对a 123 有用吗?)
  • @qiubit:不...我假设数据至少是两个字符;已修复...查看编辑后的版本。
  • 现在,Foo 234 bar 456 将如何工作?如果我理解正确,它将匹配“Foo”和“234”,我想匹配“Foo 234 bar”和“456”。
  • @qiubit:原始版本只返回一个字符串,在这种情况下会匹配。新编辑的版本返回两个子组(数据和数字),Foo 234 bar 456 返回Foo 234 bar456。它之所以有效,是因为正则表达式正在回溯......要被认为是有效的,数字必须是可选空格和字符串结尾之前的最后一件事。
猜你喜欢
  • 2012-09-20
  • 2012-10-31
  • 2018-07-18
  • 1970-01-01
  • 2020-03-16
  • 2011-04-13
相关资源
最近更新 更多