我想在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