我想分裂的例子字符串:如何使用正则表达式使用前缀字符进行分割?
〜彼得〜洛伊丝〜克里斯〜梅格〜的Stewie
上的字符~
和有结果是
彼得
Lois
Chris
Meg
St ewie
在JavaScript或C#中使用标准字符串拆分函数,第一个结果当然是一个空字符串。 我想避免不必忽略第一个结果,因为第一个结果可能实际上是一个空字符串。
我一直在使用正则表达式摆弄,我很难过。 我敢肯定有人遇到过这个问题,并提供了优雅的解决方案。
我想分裂的例子字符串:如何使用正则表达式使用前缀字符进行分割?
〜彼得〜洛伊丝〜克里斯〜梅格〜的Stewie
上的字符~
和有结果是
彼得
Lois
Chris
Meg
St ewie
在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编码风格。
如果您正在使用正则表达式,我强烈建议Mastering Regular Expressions, Third Edition by Jeffrey E. F. Friedl。到目前为止,它是理解正则表达式的最佳帮助,并且随后将作为一个很好的参考或根据需要进行复习。
在C#中,这似乎是得到你想要的东西:
"~Peter~Lois~Chris~Meg~Stewie".Split("~".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
。ToCharArray()调用是不需要的,如果你在〜字符周围使用单引号,'〜'而不是“〜” – 2009-02-01 02:29:08
这里有一个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();
}
}
}
呃,你究竟想要什么?你似乎不想丢弃第一个元素,但是你想让它成为一个空字符串......你可以改写该节吗? – Rob 2009-02-01 02:17:07
同意,你说你想让第一个元素成为一个空字符串,这与你希望结果以非空字符串开始的情况有什么不同? – 2009-02-01 02:25:19