Как заменить подстроку только один раз?
У меня есть следующая строка:
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
Вышеупомянутое будет работать независимо от того, что идет после вашей начальной строки.
Насколько я понимаю, вы хотите сопоставить последнюю строку после последней запятой.
Вот регулярное выражение:
(?<=,)[^,]*$
Объяснение:
-
(?<=,)
: просмотр назад, который проверяет наличие запятой перед строкой -
[^,]*
: отрицательный класс символов с квантором, который указывает - "соответствовать всем остальным символам несколько раз, кроме запятой" -
$
: якорь, указывающий, что этот шаблон должен заканчивать предложение
Таким образом, этот шаблон гарантирует, что запятая предшествует строке, а после предшествующей запятой нет запятой, и это в конце предложения. Таким образом, вы сопоставляете только последнюю строку без запятой после нее.