我目前正在使用 asp.net 和 C# 构建网页。我无法解析用户提供的字符串。例如,用户提供了以下字符串,我需要提取单引号或双引号之外的单词。有人可以帮我解决这个问题吗?提前感谢你的帮助。
"we run" live "experiments" inside and outside 'a lab'
使用正则表达式的预期结果是:
live
inside
and
outside
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();
这会做到的。所有与组 '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[']))+)|(?:["][^"]+?["])|(?:['][^']+?['])
祝你的现场实验好运。