我的代码如下:
var regexp = /((^\u002b[6][0]([1-9]{2}))|(^[0]([1-9]{1})))((\s)|(\u002d)|(\s\u002d\s)?)(\d{3,})((\s)|(\u002d)|(\s\u002d\s)?)(\d{3})(\d)?$/,
str = '+60123456789',
boo = 'false';
(!regexp.test(str)) ? boo = 'false' : boo = 'true';
console.log(boo);
我测试了代码,结果返回boo = 'true'
boo = 'false'
但我的localhost上有var regexp = /((^\u002b[6][0]([1-9]{2}))|(^[0]([1-9]{1})))((\s)|(\u002d)|(\s\u002d\s)?)(\d{3,})((\s)|(\u002d)|(\s\u002d\s)?)(\d{3})(\d)?$/,
str = '+60123456789',
boo = 'false';
boo = regexp.test(str) ? 'true' : 'false';
console.log(boo);
。
为什么?我的正则表达式代码有什么问题吗?
编辑:
感谢jsFiddle和@Cerbrus指出我奇怪的三元声明。
我纠正了它,但在@smnbbrv和我的localhost中仍然得到了不同的结果。
+60
编辑2:
我在之前的jsFiddle犯了一个错误。更正了它jsFiddle,但仍然存在差异。
根据here的要求,我的正则表达式是过滤数字。它应接受以0
开头的任意数字,后跟任意两个数字或regexp = /((^\u002b[6][0]([1-9]{2}))|(^[0]([1-9]{1})))((\s)|(\u002d)|(\s\u002d\s)?)(\d{3,4})((\s)|(\u002d)|(\s\u002d\s)?)(\d{3})(\d)?$/;
^
后跟任意一个数字。中间部分只是允许空格和连字符。
显然我也在@Wiktor Stribiżew和@Jaromanda X之间引起了一场小小的争斗(我非常感谢你们的帮助!)。检查后我的str值是相同的。而localhost确实仍然显示出不同的结果。
编辑3:
致@Newbee Dev:我使用Microsoft WebMatrix 3运行我的本地主机,这很重要。两个实例都使用相同的浏览器。
编辑4:
感谢@Joe详细检查我的正则表达式@Joe。但是,我的差异仍然存在。
根据他的建议更新了正则表达式。
def DownloadPdf(request, charges_id):
try:
invoice = Charge.objects.get(pk=charges_id)
except Charge.DoesNotExist:
raise Http404
response = HttpResponse(File(invoice.upload_pdf), content_type="application/pdf")
response['Content-Disposition'] = 'attachment; filename="mypdf.pdf"'
return response
答案 0 :(得分:2)
你的正则表达式有点含糊不清。
/((^\u002b[6][0]([1-9]{2}))|(^[0]([1-9]{1})))((\s)|(\u002d)|(\s\u002d\s)?)(\d{3,})((\s)|(\u002d)|(\s\u002d\s)?)(\d{3})(\d)?$/
如果我们一次将其分解为一部分:
((^\u002b[6][0]([1-9]{2}))|(^[0]([1-9]{1})))
将匹配+60
后跟2个非零数字,或0匹配后跟1个非零数字
((\s)|(\u002d)|(\s\u002d\s)?)
将匹配单个空格,单个短划线或由空格包围的短划线,或者什么都不匹配。
(\d{3,})
然后匹配3个或更多个数字< - 这是歧义所在的地方。根据正则表达式匹配器的贪婪程度,如果只剩下数字,这可能会消耗到字符串的末尾。
((\s)|(\u002d)|(\s\u002d\s)?)
(\d{3})
正好匹配3位数< - 如果前一个模式贪婪地匹配到字符串的末尾,则该模式将不匹配,因为所有数字都被消耗了。
(\d)?
一位数字或无数字
<强> TL;博士强>
此正则表达式完全有效,但会根据应用它的引擎的贪婪设置给出不同的结果。