2013-09-21 109 views
4

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

"we run" live "experiments" inside and outside 'a lab' 
使用正则表达式

预期的结果是:

live 

inside 

and 

outside 
+0

这是否允许:''live''? –

回答

1

这将做到这一点。所有小组赛 '所享有' 匹配你想要什么:

(?<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>把一个叫做所享有
  • ^"'\s方法相匹配的一切,是不是双单引号或空间群手段。
  • (?:["][^"]+?["])表示在引用下一个报价单内的所有内容。注意+?这样就不会贪婪和?:这样该组就不会被捕获。单引号一样。

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

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

祝你好运与你的现场实验。

+0

它像一个魅力一样工作。谢谢! – user2802962

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(); 
相关问题