我想分裂的例子字符串:如何使用正則表達式使用前綴字符進行分割?
〜彼得〜洛伊絲〜克里斯〜梅格〜的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