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