【问题标题】:Selecting a substring from a string in C#从 C# 中的字符串中选择子字符串
【发布时间】:2014-03-04 13:43:09
【问题描述】:

我正在寻找字符串中的字符串。

假设我有 2 个字符串:

String1 = "1.1)The Element is"

String2 = "1.1)The Element is:(-) for the sub"

如果我比较 String1 和 String2,我可以得到 "1.1)The Element is" 这没关系。

 int Length_Str1 = string1.Length;

 string2 = string2.Remove(Length_Str1);

但我也想获得非字母字符“:(-)”。我正在考虑继续提取字符,直到找到空格字符。但我不知道如何在 C# 中做到这一点。

【问题讨论】:

  • 所以基本上,你想得到1.1)The Element is:(-)
  • 你可能想看看 string.Substring
  • @Tijesunimi 是的。但这只是 1 个示例,我有更多字符串。

标签: c# string substring


【解决方案1】:

只要Char.IsLetterChar.IsWhiteSpace 返回false,您就可以使用字符:

int index = String2.IndexOf(String1);
if(index >= 0)
{
    string result = String1;
    if (String1.Length < String2.Length)
    {
        string rest = String2.Substring(index + String1.Length);
        var chars = rest.TakeWhile(c => !Char.IsLetter(c) && !Char.IsWhiteSpace(c));
        result = result + string.Join("", chars);
    }
}

请注意,您必须在文件顶部添加using System.Linq;

【讨论】:

  • 我在这一行有一个错误, var takeChars = rest.Where(c => !Char.IsLetter(c) && !Char.IsWhiteSpace(c));错误是:无法将 lambda 表达式转换为类型 'System.Func' 因为它不是委托类型
  • @Kami:我已经用您的示例字符串对其进行了测试。你用的是什么框架版本,有加using System.Linq;吗?
  • 是的,我添加了库。但是让我再检查一次。
【解决方案2】:
var String1 = "1.1)The Element is";
var String2 = "1.1)The Element is:(-) for the sub";
var result = string.Empty;
if(String2.Contains(String1))
{
    result = String1 + Regex.Match(String2.Replace(String1, string.Empty), "[^\\sa-zA-Z0-9]+").ToString();
}

//result will contain String1 + ":(-)" from String2 IF there is a match

【讨论】:

  • +1 因为和我的想法一样,至少你的回答更快了哈哈。我花了太多时间来解释一切...... :(
【解决方案3】:

这个怎么样:

string s = "1.1)The Element is:(-) for the sub";
s = s.Substring(0, s.IndexOf("(-) ") + "(-) ".Length);

这给了1.1)The Element is:(-)

string s = "1.1)The Element is:(-) for the sub";
s = s.Substring(s.IndexOf("(-) ") + "(-) ".Length);

这给出了for the sub。根据您的评论:

 string String1 = "1.1)The Element is";

 string String2 = "1.1)The Element is:(-) for the sub";
 if(String2.Contains(String1))
 {
      string s = String2.Substring(String2.IndexOf(String1)+ String1.Length);
      s = s.Substring(s.IndexOf(" ")+1);  // +1 to leave space
 }

【讨论】:

  • 并非总是如此,有些字符串包含“(-)”。有些包含“)” 有些包含“:”,有些包含“-”。我需要一些如何继续获取字符直到找到空格。
  • 你的逻辑有缺陷——空间甚至在theelement等之后——你打算如何区分它们?
  • 一旦找到匹配项,它应该开始寻找空间。
  • 匹配到什么?
  • 匹配string1和string2,现在找到匹配找到匹配字符串后的第一个空格。
【解决方案4】:

这可以很容易地用正则表达式解决:

//Note the special escape character here for the regex engine not to fail on a found ')'
string string1 = @"1.1\)The Element is:";

List<string> testStrings = new List<string>();
testStrings.Add(@"1.1)The Element is:(-) for the sub 1");
testStrings.Add(@"1.1)The Element is:) for the sub 2");
testStrings.Add(@"1.1)The Element is:[-] for the sub 3");

//Create a regular expression string based upon the 'string1' provided above.
string regularExpression = string.Format(@"(?<base>{0})+(?:[^\\sa-zA-Z0-9]+)", string1);
Regex regex = new Regex(regularExpression, RegexOptions.Multiline);
//Will contain the found results
List<string> subStrings = new List<string>();

foreach (string str in testStrings)
{
  foreach (Match match in regex.Matches(str))
  {
    if (match.Success)
    {
      subStrings.Add(str.Replace(match.Groups[0].ToString(), string.Empty));
    }
  }
}
//Display the found results
foreach (string str in subStrings)
{
  Console.WriteLine(str);
}

执行此代码后,将产生以下结果:

for the sub 1 
for the sub 2 
for the sub 3

我不确定这是否是您要查找的内容,但此代码使其能够在 'is:' 之后具有不同的模式。

编辑: Hash Sling Slasher 刚刚提供了相同的答案,虽然有点小:)

【讨论】:

    【解决方案5】:

    像这样使用Splitstring.Join 怎么样?

    var str1 = "1.1)The Element is";
    var str2 = "1.1)The Element is:(-) for the sub";
    
    str2 = string.Join(" ",str2.Split().Take(str1.Count(x => x == ' ')+1));
    

    【讨论】:

      【解决方案6】:

      下面的代码应该找到 string1 长度之后的第一个空格的索引。

      int Length_Str1 = string1.Length;
      
      string2 = string2.Remove(string2.IndexOf(' ', Length_Str1));
      

      请注意,您还应该添加一些检查以确保 string2 比 string1 长并且 .IndexOf 实际找到一个空格。

      【讨论】:

        【解决方案7】:

        你可以这样做:

        至少如果您的字符串始终具有相同的格式;)

        string result = string.Join(" ", string1.Split(' ').Take(3).ToArray<string>());
        

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-25
          • 1970-01-01
          • 2016-07-12
          • 1970-01-01
          • 2014-01-25
          • 2014-10-24
          相关资源
          最近更新 更多