带有转义双引号的RegEx

时间:2018-09-05 22:17:05

标签: regex

我有以下RegEx,这些RegEx主要适用于我的用例(CLI命令解释器):

[^\s"]+|"[^"\\]*(?:\\.[^"\\]*)*"

它符合以下情况(并成功分离了各个部分):

foo list
foo list --barId ae920cf4-79e7-4c6f-8420-2d64cd6e4ae2
foo list --name "foo's name"
foo create --description "this is a \"description\" with some escaped quotes"

缺少的部分是我用双引号转义的地方,这些引号没有被外部未转义的双引号包裹。示例:

bar create --expression service.GetData(\"2194c75c-26be-405a-b264-5a96152d93f8\")

在这里,整个“ service.GetData”语句应该是一个匹配项,但是在(转义)双引号处中断了。如果我将参数值用双引号引起来,它将起作用(就像前面的示例块中一样)。但是,不幸的是,当参数值未用双引号引起来时,我还需要它同时工作。

有人可以帮忙最后一块吗?

2 个答案:

答案 0 :(得分:1)

可以使用单引号吗?好像可以的话,您可以将报价捕获部分放到最前面,以便它与之匹配。

(?:"|')[^"\\]*(?:\\.[^"\\]*)*(?:"|')|[^\s"]+

然后将匹配以下内容:

bar create --expression 'service.GetData(\"2194c75c-26be-405a-b264-5a96152d93f8\")'

否则,您将遇到如何区分各个部分的问题。除非您可以进一步限制间距。如果您能够说不能在不包含在引号中的参数中传递空格,则可以执行以下操作:

"[^"\\]*(?:\\.[^"\\]*)*"|([^\s])+|[^\s"]+

答案 1 :(得分:0)

我最终只是用CLI客户端应用程序中的双引号包装了所有参数值。这样可以使原始RegEx正常工作。