Удалить символы после определенного символа в строке, а затем удалить подстроку?

150

Я чувствую себя глупым, когда публикую это, когда это кажется простым и есть множество вопросов по строкам / символам / регулярным выражениям, но я не смог найти то, что мне нужно (кроме как на другом языке: Удалить весь текст после определенной точки ).

У меня есть такой код:

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

Я попробовал решение в вопросе выше (надеясь, что синтаксис будет таким же!), Но нет. Я хочу сначала удалить queryString, который может быть любой переменной длины, а затем удалить имя страницы, которое снова может быть любой длины.

Как я могу удалить строку запроса из полного URL-адреса, чтобы этот тест прошел?

SventoryMang
источник

Ответы:

278

Для манипуляций со строками, если вы просто хотите убить все, что находится после?, Вы можете сделать это

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
Или это будет последнее /?
Чарли Солтс
4
Ах да, перечитайте это. В этом случае он может выполнить LastIndexOf ("/").
Энтони Пеграм
1
Спасибо x2 за предоставление двух способов сделать это!
SventoryMang
1
@gsvirdi, в этом случае вы можете загрузить этот URL-адрес Uri uri, а затем получить доступ uri.Segments. Это вернет массив, а "somepage.aspx" будет последним элементом.
Энтони Пеграм,
1
Ненавижу быть разборчивым, но разве это не должно быть index> = 0?
Дженни О'Рейли
116

Убрать все до первого /

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);
ePandit
источник
8
Имейте в виду, что все они выдадут пример, если строка вообще не содержит «/». Очевидно, что это не будет проблемой, если вы работаете с жестко запрограммированными строками, как в исходном вопросе, но в большинстве случаев вы захотите принять это во внимание.
Elezar
1
@Elezar Я думаю, вы имеете в виду "вызовет исключение", а не "пример", но ваша точка зрения хорошо сформулирована.
Фил Симан,
Ха, вот уже 5 с половиной лет, и никто об этом раньше не упоминал. Да, вы абсолютно правы, что я хотел сказать «исключение».
Елезар,
9

Вот еще одно простое решение. Следующий код вернет все до "|" персонаж:

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

Фактически, у вас может быть столько разделителей, сколько вы хотите, но если у вас есть только один символ разделения, вот как вы получите все после '|':

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

(Все, что я изменил во втором фрагменте кода, - это индекс массива.)

Джой Пинкард
источник
6

Класс Uri обычно лучше всего подходит для управления URL-адресами.

Ян Мерсер
источник
7
Было бы неплохо привести пример ссылки.
Trevor
1

Чтобы удалить все перед определенным символом, используйте ниже.

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

Он берет все до $ char и удаляет его. Теперь, если вы хотите удалить элементы после символа, просто измените +1 на -1, и все готово!

Но для URL-адреса я бы использовал встроенный класс .NET.

Т.Гарретт
источник
1

Request.QueryStringпоможет вам parametersвключить ценности и в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"];

здесь все в [] - это имя того, querystringчто вы хотите удалить.

Попробуй ... Надеюсь, это поможет.

Shary.sharath
источник