我想在C#中創建一個正則表達式,該字符串在重複時刪除特定字符,因此它不是字符串的最後一個字符。正則表達式來移除特定的重複字符
例子:
"a--b-c-" => "a-b-c"
"-a-b--c" => "a-b-c"
"--a--b--c--" => "a-b-c"
我從來沒有想要的 - 重複,我從來沒有想這是我的字符串的第一個或最後一個字符。我怎麼能寫一個正則表達式來做到這一點?
我想在C#中創建一個正則表達式,該字符串在重複時刪除特定字符,因此它不是字符串的最後一個字符。正則表達式來移除特定的重複字符
例子:
"a--b-c-" => "a-b-c"
"-a-b--c" => "a-b-c"
"--a--b--c--" => "a-b-c"
我從來沒有想要的 - 重複,我從來沒有想這是我的字符串的第一個或最後一個字符。我怎麼能寫一個正則表達式來做到這一點?
大概是最容易做的這在兩個步驟。首先用一個「 - 」替換每個出現的一個或多個「 - 」,然後修剪任何前導/尾隨「 - 」。
var reducedString = Regex.Replace(inputString, "-+", "-");
var finalString = reducedString.Trim('-');
沒有正則表達式,這可能會更容易完成。像下面這樣(未經):
string s = "--a--b--c--";
string t = "";
bool atStart = true;
bool inHyphen = false;
foreach (char c in s) {
if (c != "-") {
if (atStart) {
atStart = false;
} else if (inHyphen) {
inHyphen = false;
t += "-";
}
t += c;
} else {
inHyphen = true;
}
}
我問了一個正則表達式,否則我會接受你的答案。 – Dismissile 2011-02-24 23:51:47
@Dmissmissile:我是個實用主義者。對我來說,解決問題遠比關心如何實際完成更重要。 **編輯**請參閱@ KeithS或@ LukeH對基於正則表達式的解決方案的回答。 – mellamokb 2011-02-24 23:53:48
我理解你的思路......但我喜歡較短的代碼:) – Dismissile 2011-02-24 23:57:41
對於這個特定的問題,我可能會不使用正則表達式。相反,我可能會使用的String.Split
和String.Join
組合,這將是更簡單,更快的可能性:
像這樣:
string.Join("-", s.Split(new char[] {'-'}, StringSplitOptions.RemoveEmptyEntries));
隨着測試:
using System;
class Program
{
static string RemoveDashes(string s)
{
return string.Join("-", s.Split(new char[] { '-' },
StringSplitOptions.RemoveEmptyEntries));
}
static void Main(string[] args)
{
Tuple<string, string>[] tests = new Tuple<string,string> []
{
new Tuple<string, string> ("a--b-c-", "a-b-c"),
new Tuple<string, string> ("-a--b-c-", "a-b-c"),
new Tuple<string, string> ("--a--b--c--", "a-b-c"),
};
foreach (var t in tests)
{
string s = RemoveDashes(t.Item1);
Console.WriteLine("{3}: {0} => Expected: {1}, Actual: {2}",
t.Item1, t.Item2, s, s == t.Item2 ? "PASS" : "FAIL");
}
}
}
創造性的解決方案,我其實更喜歡這個正則表達式 – Stofke 2011-02-25 00:11:47
我知道你要的正則表達式,但你必須改變,或第二重讀,該代碼大多數人只是把它改寫,因爲它不必重新學習代碼的執行速度更快。使用內置字符串方法的2行將比重新讀取未來的正則表達式容易得多。在某些情況下速度更快。
string text = "--a-b--c-";
text = text.Replace("--", "-");
text = text.Trim('-');
這很接近,但它會將'--a-b --- c-'變成'a-b -c'。 – 2011-06-13 15:49:10
只是FYI,'Trim()'接受「params」,所以你需要的只是'.Trim (' - ')' – 2011-02-24 23:55:05
選擇類甚至是必需的嗎? ([]'s) – 2011-02-24 23:55:35
可能不是,但我知道 - 在字符範圍內需要逃脫,而我不知道它是否在一個字符之外具有特殊含義。 – KeithS 2011-02-24 23:56:35