我想在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.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");
}
}
}
string tidyText = Regex.Replace(originalText, "^-+|(?<=-)-+|-+$", "");
^-+
和-+$
子句将匹配字符串的开头和结尾处的连字符。 - Justin Morgan我知道你要求正则表达式,但是当你需要更改或重新阅读代码时,大多数人会选择重写它,因为这比重新学习代码要快。使用内置的字符串方法编写两行代码将比以后重新阅读正则表达式容易得多。在某些情况下,这也更快。
string text = "--a-b--c-";
text = text.Replace( "--", "-" );
text = text.Trim( '-' );
--a-b---c-
转化为 a-b--c
。 - Justin Morgan这可能更容易实现,而不需要使用正则表达式。可以尝试以下代码(未经测试):
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;
}
}
Trim()
接受 "params",所以你只需要.Trim('-')
。 - John Rasch"\.+"
。但这并不是 OP 的情况;他想要删除在正则表达式模式中没有特殊含义的破折号。 - KeithS