用C#解析一个字符串; 有更干净的方式吗?

Met*_*urf 5 .net c# parsing

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 );
}
Run Code Online (Sandbox Code Playgroud)

除了我对RegEx的健康厌恶之外,还有一种更简单的解析子字符串的方法吗?

编辑: 为了澄清,要解析的字符串将永远是:"乔史密斯(jsmith)"(没有引用).

Arn*_*hea 20

正则表达式是非常有用的,你可以为自己节省大量心痛,并学习它们.不是整个shebang,只是基础知识.

一个正常工作的正则表达式是"\ w + \((.*)\)" - jsmith将在Match.Groups [1]中.

一个简单的方法来获取正则表达式是找到一个网站,让你输入正则表达式和一些文本然后吐出匹配...

  • "有些人在面对问题时会想"我知道,我会使用正则表达式."现在他们有两个问题." - jwz (2认同)

pax*_*blo 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 );
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ner 5

一种黑客...... ^^

return user.Substring(user.IndexOf('(') + 1).TrimEnd(')');
Run Code Online (Sandbox Code Playgroud)

如果不user包含左括号,则IndexOf()返回-1,我们添加一个,得到零,并SubString()返回整个字符串.TrimEnd()除非用户的名字以右括号结尾,否则将无效.

如果user包含一个IndexOf()左括号,返回它的索引,我们通过添加一个来跳过左括号,然后用它提取其余的字符串Substring().最后,我们删除右括号TrimEnd().


Mat*_*ato 5

如果用户字符串始终采用"Joe Smith(jsmith)"形式,则应该可以使用.

private static string DecipherUserName(string user)
{
    string[] names = user.Split(new char[] {'(', ')'});
    return names.Length > 2 ? names[1] : user;
}
Run Code Online (Sandbox Code Playgroud)

如果用户字符串始终是"Joe Smith(jsmith)",这将始终有效.

private static string DecipherUserName(string user)
{
    return "jsmith";
}
Run Code Online (Sandbox Code Playgroud)

仅用于幽默目的的第二个条目.