正規表現を使用してプレフィックス文字を使用して分割する方法?
質問
私は例の文字列を分割したいと思います:
〜ピーター〜ロイス〜クリス〜メグ〜Stewie
文字~
上、結果はなる持っている。
ピーター
ロイス
クリス
メグ
Stewie
最初の結果はもちろん、空の文字列であるJavaScriptまたはC#で標準文字列分割機能を使用します。 私は、最初の結果が実際に空の文字列かもしれないので、最初の結果を無視することを避けるためにたいと思います。
私は、正規表現を使用して周りいじってきたと私は困惑します。 私は誰かが渡って来るとこれにエレガントなソリューションいると確信しています。
解決
あなたの要件については、私は2つのオプションが表示されます:
(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コーディングスタイルに含まれています。
あなたが正規表現で苦労している場合は、私は非常にお勧めジェフリーにより、第3版を正規表現をマスターEF Friedlのを。それは、これまでで、正規表現を理解するための最良の援助で、必要に応じて、後に優れた参照または復習として機能します。
他のヒント
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();
}
}
}