我有以下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”语句应该是一个匹配项,但是在(转义)双引号处中断了。如果我将参数值用双引号引起来,它将起作用(就像前面的示例块中一样)。但是,不幸的是,当参数值未用双引号引起来时,我还需要它同时工作。
有人可以帮忙最后一块吗?
答案 0 :(得分:1)
可以使用单引号吗?好像可以的话,您可以将报价捕获部分放到最前面,以便它与之匹配。
(?:"|')[^"\\]*(?:\\.[^"\\]*)*(?:"|')|[^\s"]+
然后将匹配以下内容:
bar create --expression 'service.GetData(\"2194c75c-26be-405a-b264-5a96152d93f8\")'
否则,您将遇到如何区分各个部分的问题。除非您可以进一步限制间距。如果您能够说不能在不包含在引号中的参数中传递空格,则可以执行以下操作:
"[^"\\]*(?:\\.[^"\\]*)*"|([^\s])+|[^\s"]+
答案 1 :(得分:0)
我最终只是用CLI客户端应用程序中的双引号包装了所有参数值。这样可以使原始RegEx正常工作。