【问题标题】:Split a string based on whitespace but ignore those in quotes [duplicate]根据空格拆分字符串,但忽略引号中的字符串[重复]
【发布时间】:2015-06-11 22:30:22
【问题描述】:

我想分割一个基于白色的字符串,但是我知道我的字符串的某些部分会用引号引起来,并且会有空格,所以我不希望它分割封装在双引号中的字符串.

        if (file == null) return;
        else
        {
            using (StreamReader reader = new StreamReader(file))
            {
                string current_line = reader.ReadLine();
                string[] item;
                do
                {
                    item = Regex.Split(current_line, "\\s+");
                    current_line = reader.ReadLine();
                    echoItems(item);
                }
                while (current_line != null);

            }
        }

上面的拆分将拆分,即使它被引用,例如“大城”成为我的数组:

0: "大

1:城镇”

编辑:在尝试@vks 回答后,我只能让 IDE 接受所有引号:Regex.Split(current_line, "[ ](?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");

Item 是一个数组,当打印出数组内容时,我的打印方法会在每个元素周围放置一个“[]”。这是我的输出:

[0  0   0   1   2   1   1   1   "Album"                 6   6   11  50  20  0   0   0   40  40  0   0   0   1   1] [] [1] [] [1] [] [1] [] [1] [] [1] [] [1] [] [1  0   0   1   3   1   1   1   "CD case"               3   3   7   20  22  0   0   0   60  0   0   0   0   1   1] [] [1] [] [1] [] [1] [] [1] [] [1] [] [1]

正如您在拆分后看到的那样,当每个元素都应该被分解时,它会将大部分字符串放入单个元素中。

这是我要拆分的文件中的一行:

0   0   0   1   2   1   1   1   "CD case"                   6   6   11  50  20  0   0   0   40  40  0   0   0   1   1  1  1  1  1  1  1

【问题讨论】:

    标签: c# regex


    【解决方案1】:
    [ ](?=(?:[^"]*"[^"]*")*[^"]*$)
    

    按此拆分。查看演示。

    https://regex101.com/r/sJ9gM7/56

    这实质上是说[ ]==捕获一个空间。

    (?=..) 前瞻,如果它前面有偶数个 "。即前面的 "somehing" 组。但它前面不应该有一个奇数 "

    string strRegex = @"[ ](?=(?:[^""]*""[^""]*"")*[^""]*$)";
    Regex myRegex = new Regex(strRegex, RegexOptions.Multiline);
    string strTargetString = @"asdasd asdasd asdasdsad ""asdsad sad sa d sad""     asdasd asdsad "" sadsad asd sa dasd""";
    
    return myRegex.Split(strTargetString);
    

    【讨论】:

    • 拜托,你能解释一下吗?
    • @vivoconunxino 检查编辑
    • 知道了,谢谢分享
    • 我能够让 IDE 接受正则表达式字符串的唯一方法是:Regex.Split(current_line, "[ ](?=(?:[^\"]*\" [^\"]*\")*[^\"]*$)"); 因为有引号所以我不知道这是否会影响正则表达式,但我的输出似乎与你得到的不同。我'将在我的编辑中提供我的输出。
    • 感谢您的更新,仍然无法使用我当前的文本。请查看我的编辑以获取我得到的输出。它只是从文件中读取的,在读取之前没有进行额外的格式化,也许这是我的问题?我将提供正在读取的文件的第一行。
    猜你喜欢
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 2018-10-26
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多