从特定字符开始删除字符串中的字符,然后删除子字符串?

194

我觉得有点傻把这个问题发出来,因为它似乎很简单而且关于字符串/字符/正则表达式的问题已经有了很多,但是我没找到我需要的东西(除了另一种语言:Remove All Text After Certain Point)。

我有以下代码:

[Test]
    public void stringManipulation()
    {
        String filename = "testpage.aspx";
        String currentFullUrl = "http://localhost:2000/somefolder/myrep/test.aspx?q=qvalue";
        String fullUrlWithoutQueryString = currentFullUrl.Replace("?.*", "");
        String urlWithoutPageName = fullUrlWithoutQueryString.Remove(fullUrlWithoutQueryString.Length - filename.Length);

        String expected = "http://localhost:2000/somefolder/myrep/";
        String actual = urlWithoutPageName;
        Assert.AreEqual(expected, actual);
    }

我尝试了上面问题中的解决方案(希望语法相同!),但没有成功。我想先移除查询字符串,它的长度可以是任意的,然后再移除页面名称,它也可以是任意长度。

我该如何从完整的URL中删除查询字符串,使得这个测试通过?

9个回答

334

如果你想要进行字符串操作,仅仅想删除问号后面的所有内容,你可以这样做:

string input = "http://www.somesite.com/somepage.aspx?whatever";
int index = input.IndexOf("?");
if (index >= 0)
   input = input.Substring(0, index);

编辑:如果要获取最后一个斜杠之后的所有内容,可以尝试以下代码:

string input = "http://www.somesite.com/somepage.aspx?whatever";
int index = input.LastIndexOf("/");
if (index >= 0)
    input = input.Substring(0, index); // or index + 1 to keep slash

或者,因为你正在使用一个URL,你可以像这样使用以下代码对其进行处理。

System.Uri uri = new Uri("http://www.somesite.com/what/test.aspx?hello=1");
string fixedUri = uri.AbsoluteUri.Replace(uri.Query, string.Empty);

1
或者是最后一个 / 吗? - Charlie Salts
4
好的,那么重新阅读一下。在这种情况下,他可以使用LastIndexOf("/")。 - Anthony Pegram
1
感谢提供两种方法! - SventoryMang
1
@gsvirdi,如果是这样的话,您可以将该URL加载到Uri uri中,然后访问uri.Segments。这将返回一个数组,而“somepage.aspx”将是最后一项。 - Anthony Pegram
2
我不想挑剔,但是应该是 index >= 0 吧? - Krisztián Balla
显示剩余4条评论

150

删除第一个 / 之前的所有内容

input = input.Substring(input.IndexOf("/"));

删除第一个/之后的所有内容

input = input.Substring(0, input.IndexOf("/") + 1);

删除最后一个 / 之前的所有内容

input = input.Substring(input.LastIndexOf("/"));

删除最后一个 / 之后的所有内容

input = input.Substring(0, input.LastIndexOf("/") + 1);

使用String.Remove()方法是删除指定字符后面的字符的更简单的解决方案,如下所示:

删除第一个/后面的所有内容

input = input.Remove(input.IndexOf("/") + 1);

删除最后一个 / 之后的所有内容

input = input.Remove(input.LastIndexOf("/") + 1);

11
请注意,如果字符串中根本没有“/”,这些代码都会抛出异常。显然,如果您使用硬编码的字符串(如原始问题中),这不会成为问题,但在大多数情况下,您需要考虑这一点。 - Elezar
2
@Elezar 我想你的意思是“会抛出异常”,而不是“一个例子”,但你的观点很好。 - Phil Seeman
4
嗨,已经有五年半了,没人提过这件事。是的,你完全正确,我本意是说“例外”。 - Elezar

14

这是另一种简单的解决方案。下面的代码将返回在 "|" 字符之前的所有内容:

if (path.Contains('|'))
   path = path.Split('|')[0];

实际上,你可以有任意多的分隔符,但假设你只有一个分隔符,在这里是如何获取'|'后面的所有内容:

if (path.Contains('|'))
   path = path.Split('|')[1];

(我在第二段代码中改变的只是数组的索引。)


5

Uri类通常是操作URL的最佳选择。


7
一个链接的例子会很好。 - Trevor

1

要删除特定字符之前的所有内容,请使用以下方法。

string1 = string1.Substring(string1.IndexOf('$') + 1);

这段代码的作用是,取出 $ 字符之前的所有内容并将其删除。如果你想删除字符后面的内容,只需将 +1 改为 -1 即可!但对于 URL,最好使用内置的 .NET 类来处理。

1

Request.QueryString 可以帮助您获取包含在 URL 中的 参数 和值。

例如:

string http = "http://dave.com/customers.aspx?customername=dave"
string customername = Request.QueryString["customername"].ToString();

所以customername变量应该等于dave

敬礼


0
我赞同Hightechrider的观点:已经为您构建了一个专门的Url类。
但是,我还必须指出,PHP的replaceAll使用正则表达式进行搜索模式,您也可以在.NET中执行此操作-请查看RegEx类。

0
你可以使用.NET内置的方法来移除QueryString。 例如,Request.QueryString.Remove["whatever"];
在方括号中的whatever是你想要移除的querystring的名称。
试试这个... 希望能对你有所帮助。

0
您可以使用此扩展方法从字符串中删除查询参数(?后的所有内容)。
public static string RemoveQueryParameters(this string str)
    {
        int index = str.IndexOf("?");
        return index >= 0 ? str.Substring(0, index) : str;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接