我想从'abc3.1'中获得'abc'和'3.1'。这是我的正则表达式(。*)(\ d +(。\ d +)?)?'它只给了我一组'abc3.1'。看起来像'?'让第二组不贪心。谢谢你的帮助。
编辑:字符串可能不会以float结束。它是utf-8编码的。
答案 0 :(得分:2)
您可以使用此正则表达式将3.1
和abc
存储在不同的组中。字符类用于捕获数字或点。
(.*?)([\d\.]+)
第一个(.*?)
使正则表达式不贪婪,只捕获数字或点之前的文本。在我们的例子中,它是第一个数字。
当正则表达式引擎看到一个数字或一个点时,它开始捕获到另一个组。
答案 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