Usunąć znaki po określonym znaku w ciągu, a następnie usunąć podciąg?


140

Czuję się trochę głupio publikując to, gdy wydaje się to dość proste i jest mnóstwo pytań dotyczących ciągów znaków / znaków / wyrażeń regularnych, ale nie mogłem znaleźć tego, czego potrzebowałem (z wyjątkiem innego języka: Usuń cały tekst po określonym punkcie ).

Mam następujący kod:

[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);
    }

Wypróbowałem rozwiązanie w powyższym pytaniu (mając nadzieję, że składnia będzie taka sama!), Ale nie. Chcę najpierw usunąć queryString, które może mieć dowolną zmienną długość, a następnie usunąć nazwę strony, która może mieć dowolną długość.

Jak mogę usunąć ciąg zapytania z pełnego adresu URL, tak aby ten test zakończył się pomyślnie?

Odpowiedzi:


265

W przypadku manipulacji na ciągach znaków, jeśli chcesz po prostu zabić wszystko po znaku?, Możesz to zrobić

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

Edycja: jeśli wszystko po ostatnim ukośniku, zrób coś takiego

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

Alternatywnie, ponieważ pracujesz z adresem URL, możesz zrobić z nim coś takiego jak ten kod

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

1
A może to będzie ostatni /?
Charlie Salts

4
Och, tak, przeczytaj to ponownie. W takim przypadku może wykonać LastIndexOf („/”).
Anthony Pegram

1
Dzięki x2 za udostępnienie dwóch sposobów, aby to zrobić!
SventoryMang

1
@gsvirdi, w takim przypadku możesz załadować ten adres URL do Uri uri, a następnie uzyskać do niego dostęp uri.Segments. To zwróci tablicę, a „somepage.aspx” będzie ostatnim elementem.
Anthony Pegram

1
Nienawidzę być wybredny, ale czy nie powinien to być indeks> = 0?
Jenny O'Reilly

103

Aby usunąć wszystko przed pierwszym /

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

Aby usunąć wszystko po pierwszym /

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

Aby usunąć wszystko przed ostatnim /

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

Usunąć wszystko po ostatniej /

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

Jeszcze prostszym rozwiązaniem usuwania znaków po określonym znaku jest użycie metody String.Remove () w następujący sposób:

Aby usunąć wszystko po pierwszym /

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

Usunąć wszystko po ostatniej /

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

7
Należy pamiętać, że wszystkie one spowodują wyświetlenie przykładu, jeśli łańcuch w ogóle nie zawiera znaku „/”. Oczywiście nie będzie to problemem, jeśli pracujesz z zakodowanymi ciągami znaków, jak w oryginalnym pytaniu, ale w większości przypadków będziesz chciał wziąć to pod uwagę.
Elezar,

7

Oto kolejne proste rozwiązanie. Poniższy kod zwróci wszystko przed „|” postać:

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

W rzeczywistości możesz mieć tyle separatorów, ile chcesz, ale zakładając, że masz tylko jeden znak separacji, oto jak uzyskać wszystko po znaku „|”:

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

(Wszystko, co zmieniłem w drugim fragmencie kodu, to indeks tablicy).


6

Klasa Uri jest ogólnie najlepszym sposobem na manipulowanie adresami URL.


7
Przydałby się przykład linku.
Trevor

1

Aby usunąć wszystko przed określonym char, użyj poniżej.

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

Co to robi, bierze wszystko przed $ char i usuwa to. Teraz, jeśli chcesz usunąć elementy po postaci, po prostu zmień +1 na -1 i gotowe!

Ale w przypadku adresu URL użyłbym wbudowanej klasy .NET, aby to zrobić.


1

Request.QueryStringpomaga uzyskać parameterswartości i zawarte wURL

przykład

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

więc zmienna nazwy użytkownika powinna być równa dave

pozdrowienia


0

Drugi Hightechrider: istnieje już utworzona dla Ciebie specjalistyczna klasa Url.

Muszę jednak również zwrócić uwagę, że metoda replaceAll w PHP używa wyrażeń regularnych dla wzorca wyszukiwania, co można zrobić również w .NET - spójrz na klasę RegEx.


0

możesz użyć wbudowanej metody .NET, aby usunąć plik QueryString. to znaczy,Request.QueryString.Remove["whatever"];

tutaj cokolwiek w [] jest nazwą tego, querystringco chcesz usunąć.

Spróbuj tego ... Mam nadzieję, że to pomoże.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.