Php 用于过滤正数和负数的正则表达式
我使用以下函数从字符串中筛选数字(包括一些特殊情况,例如价格(以$开头)): 但预期产出是:Php 用于过滤正数和负数的正则表达式,php,regex,Php,Regex,我使用以下函数从字符串中筛选数字(包括一些特殊情况,例如价格(以$开头)): 但预期产出是: {NUMBER|100.000} and {NUMBER|-0.33} and ${NUMBER|100.50} and {NUMBER|0.06}% 应该改变什么?应该做到以下几点: (-?\d+(?:\.\d+)?+) # Match number (optional decimal part) 更新 从look-behind断言中删除-,捕获第一个(\b或-) (\d+(?:\。\d+)必须包
{NUMBER|100.000} and {NUMBER|-0.33} and ${NUMBER|100.50} and {NUMBER|0.06}%
应该改变什么?应该做到以下几点:
(-?\d+(?:\.\d+)?+) # Match number (optional decimal part)
更新
从look-behind断言中删除-,捕获第一个(\b
或-
)
(\d+(?:\。\d+)
必须包含减号。也可能是\b
与-
匹配。我试过了,但是号码没有匹配。此外,1亿美元没有;不匹配…不匹配。这个数字现在根本没有匹配:(谢谢-它漂亮地捕捉到负数,但没有捕捉到100.000.000(输出:{number | 100.000}.000)知道为什么吗?这让我困扰了一段时间…一个数字的最大长度没有在正则表达式中指定?是的…(\d+(?:\。\d+)+)
必须是(\d+(?:\。\d+)
{NUMBER|100.000} and {NUMBER|-0.33} and ${NUMBER|100.50} and {NUMBER|0.06}%
(-?\d+(?:\.\d+)?+) # Match number (optional decimal part)
<?php
function _process_numbers($string) {
return preg_replace(
'/(?<!\{) # Assert no preceding {
(?<![^\s$]) # Assert no preceding non-whitespace except $-
(\b|-) # Match start of number
(\d+(?:\.\d+)*) # Match number (optional decimal part)
\b # Match end of number
(?![^{}]*\}) # Assert that next brace is not a closing brace
(?![^\s.!?,%]) # Assert no following non-whitespace except .!?,%
/x',
'{NUMBER|\1\2}', $string
);
}
echo _process_numbers("100.000.000 and -0.33 and $100.50 and 0.06%"), "\n";