4

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

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

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

live

inside

and

outside
4

2 回答 2

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();
于 2013-09-21T21:44:54.843 回答
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[']))+)|(?:["][^"]+?["])|(?:['][^']+?['])

祝你的现场实验好运。

于 2013-09-22T01:22:57.403 回答