Я совершенно новичок в регулярных выражениях и буду очень признателен за любую помощь.
Задача проста. У меня есть файл CSV с записями, которые читаются так:
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
Я хотел бы заменить первую запятую пробелом и оставить остальные запятые нетронутыми для каждой строки. Есть ли регулярное выражение, которое будет соответствовать только первой запятой?
Я попытался это: ^.....,
. Это соответствует запятой, однако, это также соответствует всей длине строки, предшествующей запятой, поэтому, если я пытаюсь заменить это пробелом, все числа также удаляются.
Ответы:
Соответствующий шаблон может быть:
Это означает
Например, в Perl все совпадения и замены будут выглядеть так:
Запасная часть просто берет все, что соответствует, и заменяет его первым блоком, который вы запомнили, и добавляет пробел. Кома "отброшена", потому что она не входит в первую группу захвата.
источник
Это, по умолчанию (то есть без
g
опции), заменяет только первое совпадение.источник
sed
,perl
и некоторые другие инструменты.Это должно соответствовать только первое число и запятая:
^(\d{5}),
. Если вы хотите поглотить все остальное в строке, измените регулярное выражение на это:^(\d{5}),(.*)$
источник
\d{5}
и нет[^,]*
? Это будет @ по крайней мере более общим.Более элегантное решение - использовать ленивое сопоставление:
это сгруппирует символы, перемещаясь от начала строки (
^
) к концу на один символ (.+?
) на каждом шаге, пока не найдет первый знак запятой. Вся эта группа вместе с первым появлением запятой будет заменена\1
символом group ( ) и пробелом.источник
*
может быть лучше, чем один,+
так чтоs/^(.*?),/\1 /
s/^([^,]*),/\1 /
что-то, что соответствует началу, что угодно, не запятая, а запятая. Кроме того, разве вы не знаете, что этоs//
ничего не меняет, не соответствует?TextPad всегда имел возможность использовать нотацию posix, но вы должны изменить настройки в другом диалоговом окне. Чтобы использовать стандартные настройки TextPad для регулярных выражений, вам необходимо «экранировать» открывающие и закрывающие скобки:
Замените пробел после 5-значного почтового индекса в начале каждой строки
С вкладкой
Как и выше, ^ означает начало строки
\ (это «экранированная скобка», и она обозначает начало первого поискового выражения, то есть пять цифр
[0-9] + означает одну или несколько цифр (не только 5-значные почтовые индексы)
\) - это еще одна "скобка с пробелом" для обозначения конца первого поискового выражения
[] это просто пробел (вы можете не указывать в скобках, но тогда никто не сможет увидеть его на этой веб-странице :-)
В выражении замены
\ 1 - первое поисковое выражение, часть между круглыми скобками (одна или несколько цифр)
\ t является символом табуляции
Таким образом, команда поиска и замены ищет одну или несколько цифр, за которыми следует пробел. Затем он заменяет все это той же группой цифр, за которой следует вкладка.
Я не думаю, что есть какой-то способ просто найти «пробел после 5 цифр», так что вы можете просто заменить пробел, не касаясь цифр. Вы должны найти 5 цифр (первая строка), а затем пробел (вторая строка). Затем, хотя это кажется избыточным или громоздким, ЗАМЕНИТЕ оригинальную строку из 5 цифр с САМОМ, после чего следует табуляция (вторая строка).
Каждый, кто знает это, забывает, что новички понятия не имеют об этом. Вот почему я говорю это для тебя, мой друг.
Ed Poor Math Tutor и бывший программист в Нью-Йорке
источник
Чтобы соответствовать только первому вхождению любого выражения регулярного выражения, удалите все флаги. Каждое выражение регулярного выражения поставляется со следующими возможными флагами и обычно по умолчанию использует глобальный флаг, который будет соответствовать более чем одному вхождению:
источник