Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要正则表达式或其他方法来分隔包含转义引号的带引号的标记吗_C#_Regex_Quotes - Fatal编程技术网

C# 需要正则表达式或其他方法来分隔包含转义引号的带引号的标记吗

C# 需要正则表达式或其他方法来分隔包含转义引号的带引号的标记吗,c#,regex,quotes,C#,Regex,Quotes,基本上,我的任务是解析此命令行: -p "This is a string ""with quotes""" d:\1.txt "d:\some folder\1.out" 我需要的是将此字符串拆分为: -p 这是一个“带引号”的字符串 d:\1.txt d:\some folder\1.out 我搜索过(是的,我确实搜索过),但我找到的所有示例要么没有包含转义引号,要么使用\“作为转义符号。我将使用真正的csv解析器,例如.NET中唯一可用的解析器: string str = "-p \"T

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

-p "This is a string ""with quotes""" d:\1.txt "d:\some folder\1.out"
我需要的是将此字符串拆分为:

  • -p
  • 这是一个“带引号”的字符串
  • d:\1.txt
  • d:\some folder\1.out

  • 我搜索过(是的,我确实搜索过),但我找到的所有示例要么没有包含转义引号,要么使用\“作为转义符号。

    我将使用真正的csv解析器,例如.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);
        }
    }
    
    使用正则表达式(如果你坚持不使用Tim Schmelter的答案所建议的解析器),类似的东西应该可以工作(它匹配给定的字符串,但我不能保证它是完全防弹的):

    如果将其分解,您可以将其分组:

    • 一个引号
      后跟一个引号
      ^”
      或两个引号
      ,后跟一个引号
    • 一组(一个或多个)非空格字符
      \S
    请参阅以使用它。

    手写版本:

    private static string[] ParseArguments(string text)
    {
        if (string.IsNullOrWhiteSpace(text)) return new string[0];
        var entries = new List<string>(8);
        var stringBuilder = new StringBuilder(64);
        var inString  = false;
        var l = text.Length;
        for (var i = 0; i < l; i++)
        {
            var c = text[i];
            if (inString)
            {
                if (c == '"')
                {
                    if (i != l - 1 && text[i + 1] == '"')
                    {
                        stringBuilder.Append(c);
                        i++;
                    }
                    else inString = false;
                }
                else stringBuilder.Append(c);
            }
            else if (c == '"') inString = true;
            else if (char.IsWhiteSpace(c))
            {
                if (stringBuilder.Length == 0) continue;
                entries.Add(stringBuilder.ToString());
                stringBuilder.Length = 0;
            }
            else stringBuilder.Append(c);
        }
        if (stringBuilder.Length != 0) entries.Add(stringBuilder.ToString());
        return entries.ToArray();
    }
    
    私有静态字符串[]解析参数(字符串文本)
    {
    if(string.IsNullOrWhiteSpace(text))返回新字符串[0];
    var条目=新列表(8);
    var stringBuilder=新的stringBuilder(64);
    var inString=false;
    var l=文本长度;
    对于(变量i=0;i
    即使它们对您不起作用,也请分享您的尝试。
    或使用\”作为转义符号。
    所以您基本上是使用
    来转义
    ,所以适应起来应该不难。我使用了这个:(“[^”\]*(?:\.\[^]*)*”)和这个((?没有Microsoft.VisualBasic,我有什么办法可以过得去吗?你会找到像或这样的替代品。但它们并不比工作的.NET解析器好!我必须测试一下,但似乎我找到了我想要的。或者
    “[^”]*(?:“[^”]*)*”\S+
    甚至更好。
    ((?:"(?:[^"]|"")*")|\S+)
    
    private static string[] ParseArguments(string text)
    {
        if (string.IsNullOrWhiteSpace(text)) return new string[0];
        var entries = new List<string>(8);
        var stringBuilder = new StringBuilder(64);
        var inString  = false;
        var l = text.Length;
        for (var i = 0; i < l; i++)
        {
            var c = text[i];
            if (inString)
            {
                if (c == '"')
                {
                    if (i != l - 1 && text[i + 1] == '"')
                    {
                        stringBuilder.Append(c);
                        i++;
                    }
                    else inString = false;
                }
                else stringBuilder.Append(c);
            }
            else if (c == '"') inString = true;
            else if (char.IsWhiteSpace(c))
            {
                if (stringBuilder.Length == 0) continue;
                entries.Add(stringBuilder.ToString());
                stringBuilder.Length = 0;
            }
            else stringBuilder.Append(c);
        }
        if (stringBuilder.Length != 0) entries.Add(stringBuilder.ToString());
        return entries.ToArray();
    }