Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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 - Fatal编程技术网

C# 如何在空格上拆分,将空格保留在引号中,而不丢失相等的空格

C# 如何在空格上拆分,将空格保留在引号中,而不丢失相等的空格,c#,regex,C#,Regex,我不擅长正则表达式,所以不太熟悉我借用的代码中的情况。我要拆分以下字符串: CHARM CARD_SLOT=1 IO_SUBSYSTEM="CHARMS" CONTROLLER="CIOC-CB3-IO" DEFINITION="CHMIO_DO_24_VDC_HIGH-SIDE_CHARM" 这是单个字符串,比如:(我想返回的内容) 我正在使用以下代码: while (null != (workString = s.ReadLine())) {

我不擅长正则表达式,所以不太熟悉我借用的代码中的情况。我要拆分以下字符串:

CHARM CARD_SLOT=1 IO_SUBSYSTEM="CHARMS" CONTROLLER="CIOC-CB3-IO" DEFINITION="CHMIO_DO_24_VDC_HIGH-SIDE_CHARM"
这是单个字符串,比如:(我想返回的内容)

我正在使用以下代码:

while (null != (workString = s.ReadLine()))
{                                        
  RegexOptions options = RegexOptions.None;
  Regex regex = new Regex(@"((""((?<token>.*?)(?<!\\)"")|(?<token>[\w]+))(\s)*)", options);                                        
  var result = (from Match m in regex.Matches(workString)
  where m.Groups["token"].Success
  select m.Groups["token"].Value).ToList();
  foreach (string o in result)
    {
       if (!o.Contains("{") || !o.Contains("}"))
         {
           endResult = endResult + "\r\n" + o;
           Console.WriteLine("'{0}'", "\r\n" + o);
         }
    }                                        
 }

这与您的示例相符:

var pattern = @"(\w[\w ]+=(?:""[^""]+""|[^ ]+))+";

var optionsList = Regex.Matches(src, pattern).Cast<Match>().Select(m => m.Value).ToList();
var模式=@“(\w[\w]+=(?:“”[^”“]+“”[^]+)+”;
var optionsList=Regex.Matches(src,pattern).Cast().Select(m=>m.Value).ToList();

此模式应适用于:

  pattern = @"[^=]+=[^=]+(\s|.$)"; //matches with spaces
  pattern = @"[^=\s]+=[^=]+(?=(\s|.$))"; //matches without spaces
我的想法是在两边(尤其是右边)都使用
=
和“环顾四周”。
在这两种模式中,我查看它是以“”结尾,还是字符串的末尾。最后,我通过使用前瞻功能删除匹配的空格,因为我们不需要它们。

尝试
Regex.Matches(s,@“([^=]+)=(\s+)).Cast()。选择(m=>new[]{m.Groups[1]。Value,m.Groups[2]。Value})
,请参阅。或者甚至可以尝试使用正则表达式。如果你想在一行中使用
魅力卡\u SLOT=1
,那么就不能在所有空格上拆分。你的和AmoT都有效,但AmoT的模式是截断引号中包含多个单词的任何内容。你的工作做得很好,所以我会给你评分。谢谢
var pattern = @"(\w[\w ]+=(?:""[^""]+""|[^ ]+))+";

var optionsList = Regex.Matches(src, pattern).Cast<Match>().Select(m => m.Value).ToList();
  pattern = @"[^=]+=[^=]+(\s|.$)"; //matches with spaces
  pattern = @"[^=\s]+=[^=]+(?=(\s|.$))"; //matches without spaces