Regex.Split在“非引用空格”上返回重复的字符串

时间:2019-03-27 01:59:07

标签: c# regex

我正在尝试制作一个正则表达式字符串,该字符串将字符串的单行分割为 命令行参数样式。其中:

  1. 空白(\s+
  2. 未被"引用

    2-a。忽略转义的"(忽略\"

根据regexr.comregex101.com(链接到测试代码),在我创建此字符串的地方,据我了解,这没有问题。

给出代码:

Regex.Split("lorem \"ipsum door?!\" sit?! amet!!!", @"(?<=^(\\""|[^""])*((?<!\\)""(\\""|[^""])*((?<!\\)""))*(\\""|[^""])*)\s+")
//(?<=^(\\"|[^"])*((?<!\\)"(\\"|[^"])*((?<!\\)"))*(\\"|[^"])*)\s+

预期:

lorem
"ipsum door?!"
sit?!
amet!!!

返回:

lorem
l
"ipsum door?!"
l
"ipsum door?!"
i
"
sit?!
l
"ipsum door?!"
i
"

amet!!!

更多信息:在添加条件2-a(忽略\")之前,我想到了这个问题,并且遇到了类似的问题。代码/结果:https://pastebin.com/76eKp1wb

1 个答案:

答案 0 :(得分:0)

我可以通过选项RegexOptions.ExplicitCapture获得想要的结果

像这样:

Regex splitter = new Regex(@"(?<=^(\\""|[^""])*((?<!\\)""(\\""|[^""])*((?<!\\)""))*(\\""|[^""])*)\s+", RegexOptions.ExplicitCapture);
var lineBreak = splitter.Split("lorem \\\"ipsum \\\" door?!\" sit?! \" amet!!!");

显然,当捕获不带或带有任何选项时,两者没有什么区别。换句话说,只有拆分时才有问题。

我最好的猜测是库试图在捕获组中捕获某些东西,然后尝试在其中进行分割。