C#方法返回字符串的一部分

时间:2011-05-11 06:16:59

标签: c# .net

我正在使用c#.net 2.0。

我跟下面的字符串

string str = "tcm:0-433-1";

现在我想在C#中创建一个方法,它将上面的字符串作为输入参数并返回"tcm:433-"

请建议最佳方式!

3 个答案:

答案 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);