我正在使用c#.net 2.0。
我跟下面的字符串
string str = "tcm:0-433-1";
现在我想在C#中创建一个方法,它将上面的字符串作为输入参数并返回"tcm:433-"
。
请建议最佳方式!
答案 0 :(得分:5)
result = Regex.Replace(input, @"^(.+:)\d-(\d+-).*$", "$1$2");
解释正则表达式:
^
- >字符串开头.+
- >任何一次或多次(.+:)
- >第一次分组\d-
- >一个数字后跟破折号\d+
- >一次或多次数字$
- >字符串结尾$1$2
- >第一和第二分组答案 1 :(得分:1)
更新:这是一个疯狂的想法。描述你想要的输入/输出(对我来说)的一种可能的方法是:你想接收所有内容,包括:
字符,然后跳过第一个{{1 }}字符,然后再次通过跟随 -
字符。
概括了这个想法,我想出了下面的一塌糊涂:
-
// Awful name, obviously.
public static string TakeSkipTakeEtc(this string source, params char[] tokens)
{
bool taking = true;
int startIndex = 0;
StringBuilder stringBuilder = new StringBuilder();
foreach (char token in tokens)
{
int index = source.IndexOf(token, startIndex);
if (index == -1)
{
if (taking)
{
stringBuilder.Append(source.Substring(startIndex));
}
return stringBuilder.ToString();
}
if (taking)
{
int length = index + 1 - startIndex;
stringBuilder.Append(source.Substring(startIndex, length));
}
startIndex = index + 1;
taking = !taking;
}
return stringBuilder.ToString();
}
上的此扩展方法采用可变数量的string
参数,它使用基本相同的逻辑(通过 A ,然后跳过 B ,然后通过 C 等)获取任何参数。
所以,例如:
char
以上输出:
Console.WriteLine("tcm:0-433-1".TakeSkipTakeEtc(':', '-', '-'));
这可能是一个过于复杂的问题解决方案吗?最有可能的。但是,嘿,这是一个有趣的小挑战(这些天我没有得到足够的那些)。
因此,根据您的特定输入和所需输出,您可以执行以下操作:
tcm:433-
显然,这是一个非常不稳定的解决方案,要求其输入匹配特定格式(至少需要10个字符长)。如果您的输入对于这种严格的方法而言过于动态,您可以考虑使用return str.Substring(0, 4) + str.Substring(6, 4);
来搜索关键的拆分字符,甚至是string.IndexOf
类( yikes! )以达到你想要的结果。
在这种特殊情况下,您可以使用Regex
查找第一个string.IndexOf
字符的位置,然后使用-
仅将字符串的一部分用于该索引击>
答案 2 :(得分:1)
也许您需要向我们展示更多输入/输出示例,以便我们能够更好地理解规则。根据你的一个例子,这样做:
string str = "tcm:0-433-1";
int token1 = str.IndexOf(":");
int token2 = str.IndexOf("-");
int token3 = str.LastIndexOf("-");
if (token1 == -1 || token2 == -1 || token3 == -1)
throw new YourException("invalid input");
string result = str.Substring(0, token1) +
str.Substring(token2 + 1, token3 - token2);