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

时间:2009-04-07 23:45:08

标签: c# .net 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 );
}

除了我对RegEx的健康厌恶之外,是否有更简单的方法来解析子字符串?

修改 为了澄清,要解析的字符串将始终为:“Joe Smith(jsmith)”(没有引用)。

6 个答案:

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

总而言之,我建议你克服对正则表达式的厌恶,因为这种情况正是他们的目的:-) ......