需要RegEx或其他一些方法来分隔包含转义引号的引用令牌

时间:2015-11-30 15:03:18

标签: c# regex quotes

基本上,我的任务是解析这个命令行:

-p "This is a string ""with quotes""" d:\1.txt "d:\some folder\1.out"

我需要将此字符串拆分为:

  1. -p
  2. 这是一个字符串“with quotes”
  3. d:\ 1.txt的
  4. d:\ some folder \ 1.out
  5. 我搜索了(是的,我确实这么做了),但我发现的所有示例都没有包含转义引号或使用\“转义符号。

3 个答案:

答案 0 :(得分:5)

我会使用真正的csv-parser,例如.NET中唯一可用的

string str = "-p \"This is a string \"\"with quotes\"\"\" d:\\1.txt \"d:\\some folder\\1.out\"";
var allLineFields = new List<string[]>();
using (var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(new StringReader(str)))
{
    parser.Delimiters = new string[] { " " };
    parser.HasFieldsEnclosedInQuotes = true; // <--- !!!
    string[] lineFields;
    while ((lineFields = parser.ReadFields()) != null)
    {
        allLineFields.Add(lineFields);
    }
}

使用您的示例字符串,列表中包含一个带有四个令牌的string[]

-p
This is a string "with quotes"
d:\1.txt
d:\some folder\1.out

答案 1 :(得分:1)

使用正则表达式(如果你坚持不使用解析器作为Tim Schmelter建议的答案),这样的东西应该有效(它匹配给定的字符串,但我不能保证它&#39;完全防弹):

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

打破它,你正在分组:

  • 引用"后跟不是引用^"或两个引号"",后跟引用"
  • 一组(一个或多个)非空格字符\S

请参阅here来解决它。

答案 2 :(得分:0)

手写版本:

dnx451