Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于过滤正数和负数的正则表达式_Php_Regex - Fatal编程技术网

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";