正则表达式 - 匹配0或1次

时间:2015-08-20 16:15:49

标签: javascript json regex

我有以下正则表达式:

var re = /^(post|merge|delete) (\/WcfDataService1\.svc\/)(.*) HTTP\/1.1$[\s\S]*?(^{.+\}$)/im

这用于匹配批量请求中的各种项目:

--batchitems
Content-Type: application/http
Content-Transfer-Encoding: binary

POST /WcfDataService1.svc/Orders(123) HTTP/1.1

{"OrderID":"x58"}
  • 第一组:类型(POST / MERGE / DELETE)
  • 第二组:/WcfDataService1.svc /
  • 第三组:在WcfDataService1.svc之后出现的任何内容,在此实例中:订单(123)
  • 第四组:JSON字符串

这很棒!当我执行re.match(str);时,我返回一个数组,如下所示:

[
    'POST',
    '/WcfDataService1.svc/',
    'Orders(123)',
    '{"OrderID":"x58"}'
]

但是,我希望JSON字符串在我的正则表达式中是可选的,因为它并不总是存在; e.g:

--batchitems
Content-Type: application/http
Content-Transfer-Encoding: binary

DELETE /WcfDataService1.svc/Orders(123) HTTP/1.1

// EOL here

但是我的正则表达式在这里失败了,因为它试图匹配大括号而它找不到它们,所以整个正则表达式都失败了。

如何使(^{.+\}$)可选(显示0或1次)?我试过了(^{.+\}$){0,1}但是没有用。

有什么想法吗?

请参阅:https://regex101.com/r/pT3fG0/2https://regex101.com/r/nO8xZ7/1

2 个答案:

答案 0 :(得分:3)

编辑1

使用?使json部分可选,如下所示:

^(post|merge|delete) (\/WcfDataService1\.svc\/)(.*) HTTP\/1.1$(?:[\s]*?(^{.+\}$))?

DEMO

enter image description here

答案 1 :(得分:1)

另一种选择可能是:

(^(post|merge|delete)\s(\/WcfDataService1\.svc\/)(.*)(HTTP\/1\.1)([\s]*)($|^{.*}))

这是你希望的。你可以看到它here