通过regexp

时间:2018-01-12 17:02:10

标签: regex

我有一个关于我创建的规则中的组的问题,以便从文本中提取日期。 我们考虑以下字符串:

fherfrefercr17hfeuetvbyeituew

字符串由开头的所有内容组成,然后有一个由一个或两个数字组成的数字,然后是所有内容。我只需要提取数字" 17"来自上面列出的字符串。

使用以下规则,我只提取7而不是17

.*(\d{1,2}).*

有人可以帮我吗?

谢谢

的Alessandro

1 个答案:

答案 0 :(得分:2)

概述

鉴于你的模式:

.*(\d{1,2}).*

这可以通过以下方式工作:

  • .*任意次数匹配任何字符
    • 此处的量词被视为贪婪,因为只要模式与字符串匹配,它就会匹配尽可能多的字符
  • \d{1,2}由于您的模式表示要匹配1个 2个数字并且前一个标记是贪婪的,因此正则表达式将匹配单个数字,因为这仍然满足模式(先前的标记偷走第一个数字。)

代码

有多种方法可以解决此问题

方法1

这将简单地从字符串中提取所有数字(1+位)。如果您只想匹配1位或2位数,请使用\d\d?\d{1,2}

\d+
\d\d?
\d{1,2}

方法2

此方法将贪婪量词*(在.*中)转换为惰性量词.*?。这将匹配任何字符,但尽可能少。这种方法的缺点是它很昂贵,因为引擎需要回溯。

.*?\d{1,2}.*

方法3

此方法可以任意次数匹配任何非数字字符,然后匹配一个或两个数字。这可能是您正在寻找的解决方案。

\D*(\d{1,2}).*