【问题标题】:Which is the best way to skip characters before underscore ( _ ) in a string using c#这是使用c#在字符串中的下划线(_)之前跳过字符的最佳方法
【发布时间】:2011-12-02 03:26:27
【问题描述】:

使用 c# 在字符串中跳过下划线 _ 之前的字符的最佳方法是什么?

eg:case 1 字符串包含_

string s="abc_defg" 

我想把 defg 换成另一个字符串

案例2

有时字符串不包含 _ 。那时我需要得到所有的字符串

例如。

s="defg"

在这两种情况下,我都想得到 "defg" 。仅当字符串中有下划线时才应用过滤。我该怎么做呢

【问题讨论】:

  • @Null Pointer 你也可以使用 String.Split

标签: c# string filtering


【解决方案1】:
string s="abc_defg";
int ix = s.IndexOf('_');
s = ix != -1 ? s.Substring(ix + 1) : s;

这里用三元运算符是没用的,最好写:

s = s.Substring(ix + 1);

直接使用 Substring 可能针对案例索引 == 0 进行优化的事实

这是你想要的吗?

但是有人建议使用 LINQ 大炮,所以

var temp = s.SkipWhile(p => p != '_').Skip(1);
s = temp.Any() ? new string(temp.ToArray()) : s;

.NET 4.0 中有一个新的string.Concat 方法。

s = temp.Any() ? string.Concat(temp) : s;

(请注意,通常 LINQ 方式较慢且阅读起来更复杂)

我将添加超级杀手:正则表达式!!!有一种观点认为,任何事情都可以用正则表达式或 jQuery 来完成! :-)

var rx = new Regex("(?:[^_]*_)?(.*)", RegexOptions.Singleline);
var res = rx.Match(s).Groups[1].Value;

我什至不会向任何人解释这只野兽,所以不要问。没用的。 (正则表达式和询问:-))

【讨论】:

  • 嘿,你为什么用我的大炮? ;)
  • @sll 因为我的没有加载空白 :-)
【解决方案2】:

我不知道如何定义最好的方法,但只要只有一个下划线就可以了。

string s1 = "abc_defg";
string s2 = "defg";

Console.WriteLine( s1.Split('_').Last() );
Console.WriteLine( s2.Split('_').Last() );

如果您需要更多灵活性,可以查看正则表达式。

Regex.Replace(s1, "^.*_", "")

【讨论】:

    【解决方案3】:

    也许是简单的功能:

    public string TakeStringAfterUnderscoreOrWholeString(string  input)
    {
       var underscorePos = input.IndexOf("_");
       return underscorePos  == -1 ? input : input.Substring(underscorePos+1);
    }
    

    现场测试:http://rextester.com/rundotnet?code=AVQO61388

    【讨论】:

      【解决方案4】:

      您可以利用 LINQ SkipWhile()

      textValue.SkipWhile(c => c != separator)
               .Skip(1)
      

      两种情况的最终解决方案:

      string textValue = "abc_defg";
      char separator = '_';
      string result = textValue.IndexOf(separator) >= 0 
                      ? new String(textValue.SkipWhile(c => c != separator)
                                            .Skip(1)
                                            .ToArray())
                      : textValue;
      

      编辑:

      我对 xanatos 的评论是正确的,但无论如何,有时找出不同的解决方案是很有趣的 :)

      【讨论】:

      • +1 因为在这里使用 LINQ 就像使用大炮对付昆虫... :-)
      • @xanatos : 放轻松 ;) LINQ 代码看起来很不错 ;)
      • @xanatos :这很明显 LINQ 不返回字符串,我相信 OP 知道如何将 IEnumerable 转换为字符串
      【解决方案5】:

      我建议为此目的简单地使用一个 string[] arr 和 split 函数。

      string[] arr=s.split('_');
      string out=arr[arr.Length-1];
      

      【讨论】:

      • 感谢您的回答。但是这个问题已经回答了。如果字符串中有多个下划线怎么办?无论如何谢谢:)
      • 在这种情况下,你应该怎么做你期望输出是......例如对于“qwe_etr_uit”应该是什么输出??
      • 在这种情况下,结果应该是 etr_ui 。何杰,我已经用过其他答案:D。所以已经用我标记为答案的答案解决了这个问题。谢谢你的努力
      猜你喜欢
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多