匹配不是价格的数字

时间:2009-11-02 22:16:25

标签: php regex

我试图用文本正文中的X替换除价格(以$开头的数字)之外的所有数字。我一直试图用后面的方式来完成工作,但似乎没有用。以下是我现在使用的内容:

$comments = preg_replace("/(?<!$)([0-9]+)/", "x", $comments);

这最终只是将所有数字替换为X,包括前面带有$的数字。

3 个答案:

答案 0 :(得分:3)

您需要使用反斜杠\$来转义美元符号,否则会将其解释为行尾/字符串。

此外,第二个括号集完全没必要 - 您没有使用您捕获的组。

哦,为了避免更换100美元之类的东西,你需要在你的负面观察中添加0-9 ...因为你这样做,你可以简单地将美元放在角色类中并且不需要逃避。

所以在这一点上我们有:

$comments = preg_replace("/(?<![$0-9])[0-9]+/", "x", $comments);

但显然“preg_replace不支持后视中的复制” - 我认为这意味着你不能在后面放置0-9,所以在它之前放置一个单词边界。

另外要避免的是取代9.99美元,所以希望我们可以指定\ d。在后视中不允许这样做。

所以你的代码最终成为:

$comments = preg_replace("/(?<!\$|\d\.)\b[0-9]+\b/", "x", $comments);


由于所有这些增加的复杂性,您将需要创建一些测试用例以确保按预期工作。

答案 1 :(得分:2)

$是正则表达式中的特殊字符(表示字符串的结尾)。你需要逃避它:\$

同样根据目前的制定,您的后视可能只会阻止它替换价格中的第一个数字;因为在第一个数字之后,由于你不再在$。

,所以后视将再次进行匹配

您可能希望使用包含\b(字边界)的内容来将匹配的数字序列的开头和结尾限制为仅为完整数字。

答案 2 :(得分:0)

这也应该有效:

/(?<=\s)[0-9]+/ 
相关问题