Как заменить подстроку только один раз?

У меня есть следующая строка:

      Log First Meal Time,Twitter,Midday Routines Done,Midday Routines

Я хочу написать регулярное выражение, чтобы я получил следующее:

      Log First Meal Time,Twitter,Midday Routines Done,⚡ Midday Routines

Как это сделать с некоторым регулярным выражением, которое будет соответствовать только второму вхождению в этом случае?

я заменялMidday Routinesс⚡ Midday Routines, но кажется, что ярлыки iPhone по умолчанию заменяют все вхождения, и я получил:

      Log First Meal Time,Twitter,⚡ Midday Routines Done,⚡ Midday Routines

Я новичок в регулярных выражениях, и у меня нет идей...

Пожалуйста помоги! Заранее спасибо.

3 ответа

Ваш вопрос не определен. Из вашего комментария похоже, что вы хотите вставить символ после последней запятой в строке.

Вы можете сделать это с помощью поиска:

      (?<=,)(?=[^,]+$)

Объяснение:

  • (?<=,)-- положительный поиск запятой
  • (?=[^,]+$)-- положительное опережение для всего, кроме запятой, до конца строки

Вы не указали язык. В JavaScript вы должны заменить:

      'Log First Meal Time,Twitter,Midday Routines Done,Midday Routines'.replace(/(?<=,)(?=[^,]+$)/, '⚡ ')
// returns: 'Log First Meal Time,Twitter,Midday Routines Done,⚡ Midday Routines'

Узнайте больше о регулярном выражении: https://twiki.org/cgi-bin/view/Codev/TWikiPresentation2018x10x14Regex

Вы не указали язык. Вот один из способов сделать это на Java.

ИспользоватьString.replaceFirst.

  • ()группа захвата
  • .*?- неохотный квантификатор
  • $nобратная ссылка на захваченные строки.
  • Первая группа захвата — это первое вхождение плюс все непосредственно перед вторым вхождением.
  • Вторая группа захвата — это второе вхождение.
      String s = "Log First Meal Time,Twitter,Midday Routines Done,Midday Routines"; 
s = s.replaceFirst("(Midday Routines.*?)(Midday Routines)", "$1\u26A1 $2");
System.out.println(s);

отпечатки

      Log First Meal Time,Twitter,Midday Routines Done,⚡ Midday Routines

Вышеупомянутое будет работать независимо от того, что идет после вашей начальной строки.

Насколько я понимаю, вы хотите сопоставить последнюю строку после последней запятой.

Вот регулярное выражение:

      (?<=,)[^,]*$

Объяснение:

  • (?<=,): просмотр назад, который проверяет наличие запятой перед строкой
  • [^,]*: отрицательный класс символов с квантором, который указывает - "соответствовать всем остальным символам несколько раз, кроме запятой"
  • $: якорь, указывающий, что этот шаблон должен заканчивать предложение

Таким образом, этот шаблон гарантирует, что запятая предшествует строке, а после предшествующей запятой нет запятой, и это в конце предложения. Таким образом, вы сопоставляете только последнюю строку без запятой после нее.

Подтвердить здесь

Другие вопросы по тегам