我使用的是C#2.0,我的字符串类型不足:
string id = "tcm:481-191820"; or "tcm:481-191820-32"; or "tcm:481-191820-8"; or "tcm:481-191820-128";
字符串的最后一部分无关紧要,即(-32,-8,-128),无论字符串是什么,它都会在结果下面呈现。
现在,我需要编写一个函数,它将上面的字符串作为输入。如下所示,将输出为“ tcm:0-481-1 ”
public static string GetPublicationID(string id)
{
//this function will return as below output
return "tcm:0-481-1"
}
请建议!!
答案 0 :(得分:1)
您只需要:
string.Format("{0}0-{1}", id.Substring(0,4), id.Substring(4,5));
这只是使用子字符串来获取前四个字符,然后是接下来的五个字符,并将它们放入0-中的格式。
这确实假设您的格式在每个位置都是固定数量的字符(在您的示例中)。如果字符串可能是abcd:4812...
,那么您将需要稍微修改它以获取正确长度的字符串。请参阅Marco对该技术的回答。如果您需要可变长度我会建议使用他,如果长度保持不变,我建议使用他。
另外,作为补充说明,返回静态字符串的原始功能适用于您提供的所有示例。我假设有其他数字可见,但如果它只是后缀改变那么你可以愉快地使用一个静态字符串(此时声明一个常量或某些东西而不是使用一个方法可能会更好地工作)。
答案 1 :(得分:1)
如果最终“-1”是静态的,您可以使用:
public static string GetPublicationID(string id)
{
int a = 1 + id.IndexOf(':');
string first = id.Substring(0, a);
string second = id.Substring(a, id.IndexOf('-') - a);
return String.Format("{0}0-{1}-1", first, second);
}
或者如果“-1”是下一个标记的第一部分,请尝试此
public static string GetPublicationID(string id)
{
int a = 1 + id.IndexOf(':');
string first = id.Substring(0, a);
string second = id.Substring(a, id.IndexOf('-') - a + 2);
return String.Format("{0}0-{1}", first, second);
}
即使您的字符串是
,此语法也适用于不同长度的模式first_part:second_part-anything_else
答案 2 :(得分:0)
强制性正则表达答案:
using System.Text.RegularExpressions;
public static string GetPublicationID(string id)
{
Match m = RegEx.Match(@"tcm:([\d]+-[\d]{1})", id);
if(m.Success)
return string.Format("tcm:0-{0}", m.Groups[1].Captures[0].Value.ToString());
else
return string.Empty;
}
答案 3 :(得分:0)
Regex regxMatch = new Regex("(?<prefix>tcm:)(?<id>\\d+-\\d)(?<suffix>.)*",RegexOptions.Singleline|RegexOptions.Compiled);
string regxReplace = "${prefix}0-${id}";
string GetPublicationID(string input) {
return regxMatch.Replace(input, regxReplace);
}
string test = "tcm:481-191820-128";
stirng result = GetPublicationID(test);
//result: tcm:0-481-1