正则表达式提取单引号或双引号之外的字符串

时间:2013-09-21 21:36:50

标签: c# asp.net regex

我目前正在使用asp.net和C#构建一个网页。我在解析用户提供的字符串时遇到问题。例如,用户提供了以下字符串,我需要提取单引号或双引号之外的单词。有人可以帮我解决这个问题吗?在此先感谢您的帮助。

"we run" live "experiments" inside and outside 'a lab'

使用正则表达式的预期结果是:

live

inside

and

outside

2 个答案:

答案 0 :(得分:1)

var parts = Regex.Split(input, @"[""'].+?[""']")
            .SelectMany(x => x.Split())
            .Where(s => !String.IsNullOrWhiteSpace(s))
            .ToList();

var parts = Regex.Split(input, @"[""'].+?[""']")
            .SelectMany(x => x.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries))
            .ToList();

答案 1 :(得分:1)

这样做。与'unquote'组匹配的所有匹配符合您的要求:

(?<unquote>[^"'\s]+)|(?:["][^"]+?["])|(?:['][^']+?['])

C#测试代码:

 var matches = Regex.Matches( @"""we run"" live ""experiments"" inside and outside 'a lab'", @"(?<unquote>[^""'\s]+)|(?:[""][^""]+?[""])|(?:['][^']+?['])" );
 foreach( Match match in matches )
 {
     if( match.Groups["unquote"].Success )
     {
         Console.WriteLine( match.Groups["unquote"].Value.Trim() );
     }
 }

输出:

  
    

         

         

         

  

其中:

  • <unquote>表示放入名为unquote的组
  • ^"'\s表示匹配不是双引号或空格的所有内容。
  • (?:["][^"]+?["])表示将报价内的所有内容与下一个报价相匹配。注意+?所以它不贪婪和?:这样就不会被捕获。单引号相同。

这将使用空字符串“”和单引号嵌套在双引号中的字符串。你想忽略撇号吗?如果是,那么您需要将正则表达式扩展一点,以允许'前面没有空格:

(?<unquote>(?>[^"\s](?<!\s[']))+)|(?:["][^"]+?["])|(?:['][^']+?['])

祝你的现场实验好运。