在CF的正则表达式中排除$

时间:2012-12-04 17:48:33

标签: javascript regex coldfusion coldfusion-9

我正在处理一些不同的表单验证类型,我无法将我愿望清单上的所有项目都用到。

我的cfinput代码是这样的(与常规表单输入相同,并且有一些罐装javascript验证)

    <cfinput type="Text" name="negdays" 
        range="0,23" 
        pattern="^(([^0]{1})([0-9])*|(0{1}))?$" 
        message="Negative Days must be a number between 0 and 23" 
        required="No"  width="2" > 

除了$之外,这个应该并且确实排除了我需要的一切。我无法阻止表单接受$

另一个类似的例子就是这个我想要一个范围并保持数字的例子,所以我混合了验证类型

    <cfinput type="text" name="achamount" 
        validate = "range,numeric" 
        range = "0,99999" 
        message="ACH Amount must be a range from 0 - 99999 and  numeric only" >

......并且它完美无缺 - 除了一个问题:允许$

所以我想也许我可以添加这样的正则表达式:

    <cfinput type="text" name="achamount" 
        validate = "range,numeric,regex" 
        range = "0,99999"  
        pattern="^\d" 
        message="ACH Amount must be a range from 0 - 99999 and  numeric only" > 

但我的模式当然只是将它限制为数字,我已经在做了。我需要我的模式来排除美元符号。但作为一个特殊角色,它的行为与我想摆脱的其他东西不同。

有任何想法或建议吗?我尝试的所有内容都无效或打破了页面上的所有其他验证。

3 个答案:

答案 0 :(得分:2)

解决方案:仅匹配数字

您无需专门排除$ - 只允许使用数字,您只需确保每个字符都匹配\d

要执行此操作,您需要将正则表达式的开头和结尾锚定到输入的开头和结尾,分别使用正则表达式元字符^$完成。 (如果您需要将这些字符中的任何一个用作文字,请在前面添加反斜杠。)


因此,对于0到99999之间的整数,您需要:

^\d{1,5}$


匹配0到23之间的整数的方式相同,但模式的中心部分需要复杂,以确保您不会达到24或更高:

^(?:[03-9]|1\d?|2[0-3]?)$

这里的三个选择是: * [03-9]匹配除1或2之外的任何单个数字。 * 1\d?匹配1,或1后跟任何数字。 * 2[0-3]?匹配2或2,后跟任何数字,最多3个。

(?: .. )是为了确保^$仍适用于整个字符串。

(当然,您也可以使用^\d{1,2}$然后检查它是否小于24。)


奖励信息:不包括字符

如上所述,在这种情况下你不需要这样做,但是如果你遇到需要排除$的情况,你可以使用负字符类来执行此操作:

^[^$]{1,5}$

或使用否定前瞻:

^(?:(?!\$).){1,5}$

后者有点复杂,但它允许更多的灵活性,因此有必要注意。

前瞻是另一种形式的锚(它在某个位置匹配,但不会消耗它匹配的字符)。当用于附加量词({1,5}位)的项目时,您需要将两个项目组合在一起才能正确应用。 (即如果你只做了(?!\$).{1,5},那么只会检查第一个字符的负向前瞻,而不是全部五个。)

请注意,字符类$之外必须转义为\$,以防止它的“字符串结束锚”的特殊含义。在角色类中,它只是一个普通角色。

(希望这个解释很清楚 - 如果有进一步的信息或说明有用,请告诉我。)

答案 1 :(得分:1)

您的正则表达式^(([^0]{1})([0-9])*|(0{1}))?$可以简化一点。您似乎希望单个数字前面有0或最多2个数字。

试试这个:^\d{2}$

答案 2 :(得分:0)

将$添加到您不允许的一系列字符怎么样?

pattern="[^$]"