正则表达式前瞻,贪婪,无论如何

时间:2014-06-26 11:32:52

标签: regex greedy

我想从'abc3.1'中获得'abc'和'3.1'。这是我的正则表达式(。*)(\ d +(。\ d +)?)?'它只给了我一组'abc3.1'。看起来像'?'让第二组不贪心。谢谢你的帮助。

编辑:字符串可能不会以float结束。它是utf-8编码的。

4 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式将3.1abc存储在不同的组中。字符类用于捕获数字或点。

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

DEMO

第一个(.*?)使正则表达式不贪婪,只捕获数字或点之前的文本。在我们的例子中,它是第一个数字。

当正则表达式引擎看到一个数字或一个点时,它开始捕获到另一个组。

答案 1 :(得分:2)

使用此:

([a-z]+)(\d+(?:\.\d+)?)

the demo中,请参阅右侧窗格中的捕获组。

<强>解释

  • ([a-z]+)会抓取一个或多个小写字母到第1组。
  • (\d+(?:\.\d+)?)会捕获一个或多个数字,也可以选择一个句点,以及一个或多个数字到第2组。

问题是什么?

  • 允许贪婪的(.*)匹配字符串中的所有字符,并且确实如此。
  • 此群组(\d+(.\d+)?)??设为可选内容,因此点星可以保留整个匹配而无需回溯。

答案 2 :(得分:1)

在你的正则表达式(.*)(\d+(.\d+)?)?中,最后一个?没有使第二组不贪婪,这使它成为可选项。

使用点转义:

(.*)(\d+(\.\d+)?)

如果第二组是强制性的,或者:

(\D*)(\d+(\.\d+)?)?

如果它是可选的。

答案 3 :(得分:0)

For Integer / Double / Float

preg_replace('/[^0-9\.]/', '', "abc3.1"); 

输出

3.1

对于字母

preg_replace('/[^a-zA-Z]/', '', "abc3.1");  

输出

abc