【问题标题】:String contains (second instance of substring)字符串包含(子字符串的第二个实例)
【发布时间】:2013-12-17 11:12:06
【问题描述】:

我正在尝试使用 C#/razor 操作字符串。

我想要做的是仅显示单词“Summary”第二次出现右侧的字符串部分。 因此,例如,如果字符串是:

概要症状 阅读更多概要 跗骨联合是青春期后期在足部形成的骨桥。随着跗骨联盟从纤维...

我想显示为:

跗骨联合是青春期后期在足部形成的骨桥。随着跗骨联盟从纤维...

所以,我想我需要知道的是如何使用“包含”来查找字符串中子字符串的第二个实例?

好的...Soner 让我朝着正确的方向前进,但是当我尝试这个时,它会出错:

@{

string s = @Html.Raw(item.ShortBody);

int firstindex = s.IndexOf("Summary ");
s = s.Remove(0, 8);
int secondindex = s.IndexOf("Summary ");

var strbody = s.Substring(secondindex + 8);
}

@strbody

如何在我的视图上将操作后的字符串输出到屏幕上? @s 不起作用..

【问题讨论】:

  • 你没有。你用String.IndexOf
  • Contains 只会告诉您字符串是否包含您要查找的字符串。所以,你没有。
  • 关于尝试输出结果时的错误 - 它是什么类型的错误(编译时或运行时)以及错误的确切消息是什么?

标签: c# string substring contains


【解决方案1】:

如果您知道字符串始终以第一个摘要开头,则可以在开始搜索之前使用包含偏移量的IndexOf 签名。

 var second = str.IndexOf("Summary", 7);
 var description = str.Substring(second + 8).TrimStart();

或者,您可以找到第一个,然后使用它的位置来找到正确的偏移量

 var second = str.IndexOf("Summary", str.IndexOf("Summary") + 7);
 var description = str.Substring(second + 8).TrimStart();

显然,这些都依赖于字符串确实包含单词Summary 的至少两个实例这一事实。如果不是这种情况,那么在尝试查找子字符串之前,您需要检查 IndexOf 的结果是否等于或大于零。

另一种选择,如果您知道该词最多出现 2 次,则使用 LastIndexOf 而不是 IndexOf,然后取其后的子字符串。

 var second = str.LastIndexOf("Summary");
 var description = str.Substring(second + 8).TrimStart();

【讨论】:

  • +1 秒的情况是最吸引人的。此外,虽然关于使用 IndexOf 两次 - 与 SplitJoin 相比,这似乎更健壮和简短。
【解决方案2】:

如果在第二个Summary 之后没有Summary 字,可以使用String.Split 之类的方法;

string s = "Summary Symptoms Read More Summary A tarsal coalition is a bridge of bone that forms in the foot in late adolescence. As the tarsal coalition progresses from a fibrous...";
var array = s.Split(new string[] {"Summary "}, StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine(array[1]);

输出将是;

A tarsal coalition is a bridge of bone that forms in the foot in late adolescenc
e. As the tarsal coalition progresses from a fibrous...

这里是 demonstration

如果您在第二个摘要之后有一个摘要词,您可以使用String.IndexOfString.SubString 等方法;

string s = "Summary Symptoms Read More Summary A tarsal coalition is a bridge of bone that forms in the foot in late adolescence. As the tarsal coalition progresses from a fibrous...";
int firstindex = s.IndexOf("Summary ");
s = s.Remove(firstindex, 8);
int secondindex = s.IndexOf("Summary ");
Console.WriteLine(s.Substring(secondindex + 8));

输出将是;

A tarsal coalition is a bridge of bone that forms in the foot in late adolescenc
e. As the tarsal coalition progresses from a fibrous...

这里是 demonstration

【讨论】:

  • 如果另一个Summary 在第二次出现后出现怎么办?
  • 您好,感谢您的快速响应! Summary这个词永远不会出现第三次,所以我认为这应该没问题。不过,我想知道如何将数组值“内联”而不是输出到控制台?我问,因为这不起作用:@{ string s = @Html.Raw(item.ShortBody); var array = s.Split(new string[] {"Summary"}, StringSplitOptions.RemoveEmptyEntries); } @array[1]
  • @IlyaIvanov 您现在可以查看 :)
  • 如果你打算这样做,你应该使用最大计数的版本并将分割数限制为3:Split(new [] { "Summary" }, 3, StringSplitOptions.RemoveEmptyEntries);
  • @SonerGönül 我在尝试此操作时也遇到错误...不确定如何输出到屏幕? @{ 字符串 s = @Html.Raw(item.ShortBody); int firstindex = s.IndexOf("摘要"); s = s.Remove(0, 8); int secondindex = s.IndexOf("摘要"); s = s.Substring(secondindex + 8); } @s
猜你喜欢
  • 2018-04-23
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
相关资源
最近更新 更多