gpt4 book ai didi

c# - 解析带空格和引号的字符串(保留引号)

转载 作者:太空狗 更新时间:2023-10-29 20:23:33 25 4
gpt4 key购买 nike

如果我有这样的字符串

create myclass "56, 'for the better or worse', 54.781"

我怎样才能解析它使得结果是三个字符串“单词”,它们具有以下内容:

[0] create
[1] myclass
[2] "56, 'for the better or worse', 54.781"

编辑2:注意要保留引号

起初,我尝试使用 string.Split(' '),但我注意到它会使第三个 string 分解为其他几个字符串。

我尝试通过将其 count 参数用作 3 来限制 Split 结果来解决此问题。在这种情况下可以吗,但是当给定的字符串是

create myclass false "56, 'for the better or worse', 54.781" //or
create myclass "56, 'for the better or worse', 54.781" false

然后拆分失败,因为最后两个单词将被合并。

我还创建了类似 ReadInBetweenSameDepth 的东西来获取引号之间的 string

这是我的ReadInBetweenSameDepth 方法

//Examples:
//[1] (2 + 1) * (5 + 6) will return 2 + 1
//[2] (2 * (5 + 6) + 1) will return 2 * (5 + 6) + 1
public static string ReadInBetweenSameDepth(string str, char delimiterStart, char delimiterEnd) {
if (delimiterStart == delimiterEnd || string.IsNullOrWhiteSpace(str) || str.Length <= 2)
return null;
int delimiterStartFound = 0;
int delimiterEndFound = 0;
int posStart = -1;
for (int i = 0; i < str.Length; ++i) {
if (str[i] == delimiterStart) {
if (i >= str.Length - 2) //delimiter start is found in any of the last two characters
return null; //it means, there isn't anything in between the two
if (delimiterStartFound == 0) //first time
posStart = i + 1; //assign the starting position only the first time...
delimiterStartFound++; //increase the number of delimiter start count to get the same depth
}
if (str[i] == delimiterEnd) {
delimiterEndFound++;
if (delimiterStartFound == delimiterEndFound && i - posStart > 0)
return str.Substring(posStart, i - posStart); //only successful if both delimiters are found in the same depth
}
}
return null;
}

但是尽管这个函数可以正常工作,但我发现很难将结果与 string.Split 结合起来以按照我的意愿进行正确的解析。

编辑 2:在我糟糕的解决方案中,我需要稍后重新添加引号

有没有更好的方法来做到这一点?如果我们使用 Regex,我们该怎么做?

编辑:

老实说,我不知道这个问题可以用与 CSV 格式文本相同的方式解决。我也不知道这个问题不一定由 Regex 解决(因此我将其标记为这样)。对于那些将此视为重复帖子的人,我深表歉意。

编辑 2:

在我的项目上做了更多工作后,我意识到我的问题有问题(也就是说,我没有包括引号)-我向之前最好的回答者 Tim Schmelter 先生致歉。然后在查看了 dupe-link 之后,我注意到它也没有为此提供答案。

最佳答案

你可以这样分割

\s(?=(?:[^"]*"[^"]*")*[^"]*$)

查看演示。

https://regex101.com/r/fM9lY3/60

string strRegex = @"\s(?=(?:[^""]*""[^""]*"")*[^""]*$)";
Regex myRegex = new Regex(strRegex, RegexOptions.Multiline);
string strTargetString = @"create myclass ""56, 'for the better or worse', 54.781""";

return myRegex.Split(strTargetString);

关于c# - 解析带空格和引号的字符串(保留引号),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34607051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com