Разделите строку несколькими разделителями и сохраните разделитель в результате [duplicate]

Я не думаю, что вы можете выбрать родителя только в css.

Но поскольку у вас уже есть класс .active, не было бы легче перенести этот класс на li (вместо a)? Таким образом, вы можете получить доступ только к li и a только через css.

1
задан Admiral Land 31 October 2016 в 13:42
поделиться

2 ответа

Вам нужен шаблон только с lookahead:

\s+(?=delim1|delim2)

\s+ будет соответствовать одному или нескольким пробелам (так как ваша строка содержит пробелы). Если не может быть пробелов, используйте \s* (но тогда вам нужно будет удалить пустые записи из результата). См. Демонстрацию regex . Если эти разделители должны быть целыми словами, используйте границы слова \b: \s+(?=\b(?:delim1|delim2)\b).

В C #:

addrArr = Regex.Split(inputText, string.Format(@"\s+(?={0})", string.Join("|", delimeters)));

Если разделители могут содержать специальные метасимволы регулярных выражений, вы будете необходимо запустить Regex.Escape в списке delimiters.

A C # demo :

var inputText = "substring1 delim1 substring2 delim2 substr3";
var  delimeters = new List<string> { "delim1", "delim2" };
var addrArr = Regex.Split(inputText, 
        string.Format(@"\s+(?={0})", string.Join("|", delimeters.Select(Regex.Escape))));
Console.WriteLine(string.Join("\n", addrArr));
2
ответ дан Wiktor Stribiżew 19 August 2018 в 19:04
поделиться
  • 1
    Ты бил меня на несколько секунд. :) Что касается Regex.Escape, я бы рекомендовал always использовать его при конкатенации шаблона с литералами, даже если на входе не должно содержаться недопустимых символов. В зависимости от того, как код используется позже, это могло бы иначе открыть вектор атаки (сбой приложения из-за неправильного шаблона или, возможно, даже хуже). – Lucero 31 October 2016 в 13:53
  • 2
    С помощью Regex.Escape шаблон будет выглядеть как string.Format(@"\s+(?={0})", string.Join("|", delimeters.Select(Regex.Escape))) . Однако помните, что в случае, если разделители могут содержать символы без слова в начале / конце, вы не сможете использовать \b, потребуется некоторая логическая логика. – Wiktor Stribiżew 31 October 2016 в 13:55

Я думаю, вам нужно использовать lookahead, а не lookbehind, чтобы это работало (хотя и не пробовал).

Кроме того, вы должны быть осторожны с разделителями;

Попробуйте следующее:

addrArr= Regex.Split(inputText, string.Format("(?={0}|{1})", Regex.Escape(delimeter1), Regex.Escape(delimeter2)), RegexOptions.None);
2
ответ дан Lucero 19 August 2018 в 19:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: