条件RegEx字符

时间:2014-10-13 12:06:03

标签: regex preg-replace expression

如何使用条件字符执行正则表达式?

例如,我有以下表达式:

preg_replace(/\$[0-9]{1,10}|[0-9]{1,10}\$/, '', $content);

这取代了9000美元和9000美元。 我可以简化那个表达吗?如果$字符位于数字的开头或末尾,它仍将取代价格?

2 个答案:

答案 0 :(得分:0)

如果数字与$符号之间有可选空格:

preg_replace(/\$\s*[0-9]{1,10}\b|\b[0-9]{1,10}\s*\$/, '', $content);

答案 1 :(得分:0)

您使用的模式已经非常简单,很难进一步简化。但是,如果你的评论建议,你必须添加更多的模式替代品,你可以这样做:

(\$)?\d{1,10}(?(1)|\$)

这样,添加更多替代方案很容易,因为不需要为每个替代方案添加\$<your pattern>|<your pattern>\$

这是它的工作原理:

(\$)? # capture a dollar sign in group 1, if possible
\d{1,10} # here comes your pattern, e.g. matching 1 to 10 digits
(?(1)|\$) # finally, a conditional statement:
          #     if group 1 captured something (a dollar sign in this case), match nothing.
          #     otherwise, match a dollar sign.

添加替代品很简单:

(\$)?
(?: # don't forget to enclose the alternatives in braces
    \d{1,10} # alternative 1
|
    [\s+]\d{1,10} # alternative 2
|
    # alternative 3 here, etc...
)
(?(1)|\$)

然而,很少需要这样的东西。只有在替代方案完全不同的情况下,才需要替代方案。您的模式捕获美元符号$的事实表明该模式应该与数字匹配 - 并且所有数字看起来几乎相同。它们可能是也可能不是负数(也可能不是-),它们可能是也可能不是浮点数,它们可能是也可能不是数字和美元符号之间的空格,但它仍然可能(和合理的)制作一个捕获所有这些的正则表达式模式,没有使用任何替代方案:

(\$)?\s?[+-]?\d+(?:\.\d+)?(?(1)|\s?\$)

这种模式很容易维护 - 例如如果您觉得需要支持数千个分隔符,则不必在多个位置更新模式,如果您使用替代方案的情况就是如此。