C#中Java子串的等价物是什么?

时间:2012-11-25 20:35:02

标签: c# substring

当我想在substring中查找Java中字符串中的文本区域时,我提供了两个索引,一个用于start,另一个用于end,但是在C#中,我被迫提供substring的长度作为参数,但如果我不知道我应该停在哪里这会成为一个问题,导致我有这样的事情:

verse[i].Substring(verse[i].IndexOf("start"), (verse[i].IndexOf("end") - verse[i].IndexOf("start"));

而非

verse[i].Substring(verse[i].IndexOf("start"), (verse[i].IndexOf("end"));

令人讨厌的是,我一遍又一遍地遇到这个问题,我想知道我是唯一一个还是有一个我不知道的技巧。你最好怎么解决这个问题? (考虑清洁度和速度)

ps:我不喜欢为几乎所有东西创建变量。感谢

4 个答案:

答案 0 :(得分:9)

您可以像这样编写自己的扩展方法

var newstr = str.MySubString(start,end);

..

public static partial class MyExtensions
{
    public static string MySubString(this string s,int start,int end)
    {
        return s.Substring(start, end - start + 1);
    }
}

答案 1 :(得分:6)

你接受的答案是错误的,因为你说错了。

在java中,当你调用substring(START,END)时,你得到一个从START开始到END - 1结束的子字符串。

在c#中你只需要打电话:

Substring(START, END - START);

如果您按照建议添加1,您将获得不同的字符串。

答案 2 :(得分:2)

OP询问“C#中Java子字符串的等价物是什么”?我很高兴看到自从我将使用String.substring的Java方法转换为C#以来的响应。但是,根据官方Java文档,The substring begins at the specified beginIndex and extends to the character at index endIndex -1 这对我来说不仅仅是一个小小的差别,因为我想用最少的努力将Java转换为C#。上面提到的扩展是一个很好的答案,当然我可以忍受。但是对于我的需求,一个更精确的类Java版本应该返回s.Substring(start,end - start);不要开始+ 1

使用Java doc示例,测试显示这是正确的:

[TestMethod]
    public void TestSubString()
    {
         Assert.AreEqual("urge", "hamburger".MySubstring( 4, 8));
        Assert.AreEqual("mile", "smiles".MySubstring(1, 5));
    }

答案 3 :(得分:0)

试试这个扩展方法:

public static class StringExtensions
{
    public static string MySubstring(this string s, string start, string end)
    {
        int startI = s.IndexOf(start);
        int endI = s.IndexOf(end, startI);
        return s.Substring(startI, endI - startI + 1);
    }
}

像这样使用:

string helloWorld = "startHello Worldend".MySubstring("start", "end");
string vers = verse[i].MySubstring("start", "end");

有时扩展方法可以拯救你的生命。您应该只知道,如果静态类是公共的并且在您的命名空间中,那么使用您的命名空间的每个人也都会获得您的扩展。