2016-12-16 72 views
3

我想拿出一个正则表达式匹配不属于价格数字额外的空间。
100 - 应符合
$ 100 - 不应与美元符号 b在正则表达式包括

我试图[^\$]100但它得到了额外的空间前述100

Regex result example

我想与其他一些字符串来代替数字的话。

“100” 将成为 “!”

这工作得很好,但我想忽略那些开始$ “$ 100”的那些变成“$!” 我不想那样,我想要100美元被忽略。

任何想法?

+0

所以,基本上你要$ 100的100部分匹配吗? –

+0

不是,我想匹配不以$开头的数字。 –

+1

你想要一个负面的前瞻 – 2016-12-16 01:09:49

回答

4

只需尝试找到没有以前缀$为前缀的数字,并替换那些带有前缀字符的数字,然后在您的示例中使用!

$test_string = "This is a number 100 but this isn't \$100."; 
$result = preg_replace('/([^\$\d])(\d+)/', '\1!', $test_string); 
var_dump($result); 
+1

您的查询与我的工作相似 我的预期结果是 “这是一个数字!但这不是100美元。“ 但它变成了 ”这是一个数字!但是这不是100美元“ 我的挣扎是美元符号与\ b的奇怪关系 –

+1

@KarloSerrano你用'preg_replace'测试了它,包括第二个参数吗?在小提琴中它的工作方式是你想要的。 – Jeff

+0

@ Karlo Serrano也许并不是真正的空间,但正如其他人所说的那样,它是有效的:http://ideone.com/3pBley – 2016-12-16 01:39:01

4

使用负回顾后有一个单词边界:

\s*(?<!\$)\b\d+ 

替换为!。请参阅regex demo

详细

  • \s* - 0+空格
  • (?<!\$) - 不匹配前面有$
  • \b位置 - 领先字边界
  • \d+ - 1+数字(以匹配一个浮点数,也使用\d*\.?\d+)。

PHP demo

$str = 'This is a number 100 but this isn\'t $100.'; 
$re = '~\s*(?<!\$)\b\d+~'; 
$subst = '!'; 
$result = preg_replace($re, $subst, $str); 
echo $result; 
// => This is a number! but this isn't $100. 
+0

不要在regexr.com上测试PHP正则表达式,那个正则表达式测试网站只支持JavaScript正则表达式。Regex101.com是测试PCRE正则表达式的更好选择。 –