Javascript相同的正则表达式返回不同的结果

时间:2016-11-15 07:43:23

标签: javascript regex

我的代码如下:

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

here

1 个答案:

答案 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;博士
此正则表达式完全有效,但会根据应用它的引擎的贪婪设置给出不同的结果。