C#,. NET 3.5
这对我来说只是难闻,但我想不出另一种方式。
给定一个格式为“Joe Smith(jsmith)”(没有引号)的字符串,我想在括号内解析出'jsmith'字符串。我想出了这个:
private static string DecipherUserName( string user )
{
if( !user.Contains( "(" ) )
return user;
int start = user.IndexOf( "(" );
return user.Substring( start ).Replace( "(", string.Empty ).Replace( ")", string.Empty );
}
除了我对RegEx的健康厌恶之外,是否有更简单的方法来解析子字符串?
修改 为了澄清,要解析的字符串将始终为:“Joe Smith(jsmith)”(没有引用)。
答案 0 :(得分:20)
正则表达式是非常有用的,你可以为自己节省大量心痛,并学习它们。不是整个shebang,只是基础。
一个正常工作的正则表达式是“\ w + \((。*)\)” - jsmith将在Match.Groups [1]中。
获取正则表达式的一个简单方法是找到一个网站,让你输入一个正则表达式,然后一些文字然后吐出匹配......
答案 1 :(得分:9)
你不应该需要第一个替换,因为你可以只添加1到“(”位置。
private static string DecipherUserName (string user) {
int start = user.IndexOf( "(" );
if (start == -1)
return user;
return user.Substring (start+1).Replace( ")", string.Empty );
}
答案 2 :(得分:5)
有点黑客...... ^^
return user.Substring(user.IndexOf('(') + 1).TrimEnd(')');
如果user
不包含左括号,IndexOf()
返回-1
,我们添加一个,得到零,SubString()
返回整个字符串。除非用户的名字以右括号结尾,否则TrimEnd()
将无效。
如果user
包含左括号,IndexOf()
返回其索引,我们通过添加一个来跳过左括号,并使用Substring()
提取字符串的其余部分。最后,我们使用TrimEnd()
删除右括号。
答案 3 :(得分:5)
如果用户字符串始终采用“Joe Smith(jsmith)”的形式,则应该可以使用。
private static string DecipherUserName(string user)
{
string[] names = user.Split(new char[] {'(', ')'});
return names.Length > 2 ? names[1] : user;
}
如果用户字符串始终是“Joe Smith(jsmith)”,这将始终有效。
private static string DecipherUserName(string user)
{
return "jsmith";
}
仅用于幽默目的的第二个条目。
答案 4 :(得分:2)
由于IndexOf函数在值不存在时将返回-1,因此您可能会略微不同......
private static string DecipherUserName( string user )
{
int start = user.IndexOf( "(" );
if (start > -1)
{
return user.Substring( start ).Replace( "(", string.Empty ).Replace( ")", string.Empty );
}
else
{
return user;
}
}
答案 5 :(得分:1)
我用
int start=user.IndexOf('(');
if (start != -1) {
end = user.IndexOf(')', start);
return user.Substring(start+1,end-start-1);
} else
return user;
但这只是一个美化改变:使用IndexOf中的字符要快一点,并且使用Substring方法似乎更准确地表达应该做什么(如果你有多对括号,方法会更健壮。 ..)
那就是说, Daniel L 的方法(使用String.Split
)可能更简单(但不能很好地处理格式错误的字符串,并且必须构造一个字符串数组)。 / p>
总而言之,我建议你克服对正则表达式的厌恶,因为这种情况正是他们的目的:-) ......