我想拆分示例字符串:
~Peter~Lois~Chris~Meg~Stewie
在角色上~
,结果是
彼得·
洛伊丝
克里斯·
梅格·
斯图维
在 javascript 或 C# 中使用标准字符串拆分函数,第一个结果当然是一个空字符串。我想避免忽略第一个结果,因为第一个结果实际上可能是一个空字符串。
我一直在摆弄使用正则表达式,我很困惑。我敢肯定有人已经遇到过这个问题的优雅解决方案。
对于您的要求,我看到两个选项:
(1) 删除初始前缀字符(如果存在)。
(2) 使用完整的正则表达式来分隔字符串。
两者都在此代码中进行了说明:
using System;
using System.Linq;
using System.Text.RegularExpressions;
class APP { static void Main() {
string s = "~Peter~Lois~Chris~Meg~Stewie";
// #1 - Trim+Split
Console.WriteLine ("[#1 - Trim+Split]");
string[] result = s.TrimStart('~').Split('~');
foreach (string t in result) { Console.WriteLine("'"+t+"'"); }
// #2 - Regex
Console.WriteLine ("[#2 - Regex]");
Regex RE = new Regex("~([^~]*)");
MatchCollection theMatches = RE.Matches(s);
foreach (Match match in theMatches) { Console.WriteLine("'"+match.Groups[1].Value+"'"); }
// #3 - Regex with LINQ [ modified from @ccook's code ]
Console.WriteLine ("[#3 - Regex with LINQ]");
Regex.Matches(s, "~([^~]*)")
.OfType<Match>()
.ToList()
.ForEach(m => Console.WriteLine("'"+m.Groups[1].Value+"'"))
;
}}
#2 中的正则表达式匹配分隔符,后跟包含零个或多个非分隔符的匹配组。结果匹配是分隔字符串(包括任何空字符串)。对于每个匹配,“match.Value”是包含前导分隔符的整个字符串,“match.Groups 1 .Value”是第一个包含无分隔符字符串的匹配组。
为了完整起见,第三个编码 (#3) 包含在 #2 中显示相同的正则表达式方法,但采用 LINQ 编码样式。
如果您正在为正则表达式苦苦挣扎,我强烈推荐Jeffrey EF Friedl 的 Mastering Regular Expressions, Third Edition。到目前为止,它是理解正则表达式的最佳帮助,以后可以根据需要作为很好的参考或复习。
在 C# 中,这似乎得到了你想要的:
"~Peter~Lois~Chris~Meg~Stewie".Split("~".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
这是一种LINQ方法...
请注意,RegexOptions.ExplicitCapture 不包括匹配项。没有它,'~' 也将被包括在内。
using System;
using System.Linq;
using System.Text.RegularExpressions;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
string s = "~Peter~Lois~Chris~Meg~Stewie";
Regex.Split(s, "(~)", RegexOptions.ExplicitCapture)
.Where(i=>!String.IsNullOrEmpty(i))
.ToList().ForEach(i => Console.WriteLine(i));
Console.ReadLine();
}
}
}