我有一个旧表单,仍然必须使用cfform进行客户端验证。
我还有一个正则表达式模式用于验证,我试图验证电话号码字符串。
<cfinput class="form-field" required="yes" value="#session.userdetails.shipping.deliveryaddress.telephoneNumber#" message="Please Enter your Phone Number" name="telephoneNumber" type="text" id="PhoneNumber" validate="regex" pattern="^[0-9\.\-' ']+$" maxlength="25" size="26" />
我尝试了许多不同的模式来将字符串验证为特定格式。
我需要它至少7个字符 它可以包含空格 必须是数字
^[0-9\.\-' ']{7}+$
^[0-9\.\-' ']{7,}+$
关于为何不能验证我的要求的任何想法?
答案 0 :(得分:0)
“关于为何不能验证我的要求的任何想法?”
因为您正在使用的正则表达式包含JS不支持的语法 - 如果您在浏览器控制台中查看,则在尝试验证时会看到错误。 (您可能需要选择“持久”选项才能看到它。)
你的错误在于你要么把两个量词放在一起,要么就已经看到了所谓的占有量词,并尝试使用它,(但JS并不支持它们)。
解决方案是简单地使用{7,}
而不使用+
,并且您的模式将几乎按预期工作:周围的引号不需要字符类中的空格(并且特别允许该字符),并且点不需要在字符类中转义 - 因此您想要的模式是^[0-9.\- ]{7,}$
或^[\d .-]{7,}$
。 / p>
通过快速记录与其他类型相比的占有量词:
x{7,}
是一个具有贪婪行为的量词,意味着它与x 尽可能多地匹配,但至少需要七次。x{7,}+
是一个具有占有行为的量词,意味着它匹配x 找到的次数,但至少需要七次。x{7,}?
是一个具有懒惰行为的量词,这意味着它会尝试匹配x七次,然后尽可能少地使用来成功匹配。x+
是x{1,}
的简写,您可以x++
和x+?
更改默认的贪婪量词。同样,JS和CF使用的正则表达式实现不支持占有量词(因此无效语法),但它们同时支持贪婪(默认)和懒惰。
占有欲和贪婪之间的区别可能看起来很微妙 - 对于单项模式而言,它实际上并没有实现 - 但它可以在执行中产生非常显着的差异......但是这种情况正在转向跟踪核心答案,所以我会在这里停下来。