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"
我需要的是将此字符串拆分为:
我搜索过(是的,我确实搜索过),但我找到的所有示例要么没有包含转义引号,要么使用\“作为转义符号。我将使用真正的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();
}