regex 正则表达式拆分保留字符串和转义符

nhaq1z21  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(165)

我需要在C#中拆分一个字符串,基于空格作为分隔符并保留引号。这部分是可以的。但另外,我想允许字符串\"使用转义符,以便在引号中包含其他引号。
我需要的示例:

One Two "Three Four" "Five \"Six\""

收件人:

  • 一个
  • 两个
  • 三四
  • 五“六”

这是我目前使用的正则表达式,它适用于除"Five \"Six\""以外的所有情况

//Split on spaces unless in quotes
        List<string> matches = Regex.Matches(input, @"[\""].+?[\""]|[^ ]+")
            .Cast<Match>()
            .Select(x => x.Value.Trim('"'))
            .ToList();

我在找任何正则表达式,都可以。

nkcskrwz

nkcskrwz1#

您可以使用

var input = "One Two \"Three Four\" \"Five \\\"Six\\\"\"";
// Console.WriteLine(input); // => One Two "Three Four" "Five \"Six\""
List<string> matches = Regex.Matches(input, @"(?s)""(?<r>[^""\\]*(?:\\.[^""\\]*)*)""|(?<r>\S+)")
            .Cast<Match>()
            .Select(x => Regex.Replace(x.Groups["r"].Value, @"\\(.)", "$1"))
            .ToList();
foreach (var s in matches)
    Console.WriteLine(s);

请参阅C# demo
结果是

One
Two
Three Four
Five "Six"

(?s)"(?<r>[^"\\]*(?:\\.[^"\\]*)*)"|(?<r>\S+)正则表达式匹配

  • (?s)-一个RegexOptions.Singleline等价函数,用于使.也匹配换行符
  • "(?<r>[^"\\]*(?:\\.[^"\\]*)*)"-",然后组“r”捕获除"\之外的任何零个或多个字符,然后捕获任何转义字符的零个或多个序列以及除"\之外的零个或多个字符,然后匹配"
  • |-或
  • (?<r>\S+)-“r”组:一个或多个空格。

.Select(x => Regex.Replace(x.Groups["r"].Value, @"\\(.)", "$1"))采用Group“r”值并取消转义(删除之前的\)所有转义字符。

相关问题