34

Я совершенно новичок в регулярных выражениях, и я был бы очень признателен за любую помощь.

Задача проста. У меня есть файл CSV с записями, которые читаются так:

12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890

Я хотел бы заменить первую запятую пробелом и оставить остальные запятые нетронутыми для каждой строки. Есть ли регулярное выражение, которое будет соответствовать только первой запятой?

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

5 ответов5

43

Соответствующий шаблон может быть:

^([^,]+),

Это означает

^        starts with
[^,]     anything but a comma
+        repeated one or more times (use * (means zero or more) if the first field can be empty)
([^,]+)  remember that part
,        followed by a comma

Например, в Perl все совпадения и замены будут выглядеть так:

s/^([^,]+),/\1 /

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

5
s/,/ /

Это по умолчанию (т.е. без опции g ) заменяет только первое совпадение.

1

Более элегантное решение - использовать ленивое сопоставление:

s/^(.+?),/\1 /

это сгруппирует символы, перемещаясь от начала строки (^) к концу на один символ (.+?) на каждом шаге, пока он не найдет первый знак запятой. Вся эта группа вместе с первым появлением запятой будет заменена на группу (\1) и пробел.

1

Это должно соответствовать только первое число и запятая: ^(\d{5}), Если вы хотите сожрать все остальное в строке, измените регулярное выражение на следующее: ^(\d{5}),(.*)$

0

TextPad всегда имел возможность использовать нотацию posix, но вы должны изменить настройки в другом диалоговом окне. Чтобы использовать стандартные настройки TextPad для регулярных выражений, вам необходимо "экранировать" открывающие и закрывающие скобки:

Замените пробел после 5-значного почтового индекса в начале каждой строки

^\([0-9]+\)[ ]

С вкладкой

\1\t

Как и выше, ^ означает начало строки

\(это "экранированная скобка", и она обозначает начало первого поискового выражения, то есть пять цифр

[0-9]+ означает одну или несколько цифр (а не только 5-значные почтовые индексы)

\) - это еще одна "скобка с пробелом" для обозначения конца первого поискового выражения

[] это просто пробел (вы можете оставить скобки, но тогда никто не сможет увидеть его на этой веб-странице :-)

В выражении замены

\1 - первое поисковое выражение, часть между круглыми скобками (одна или несколько цифр)

\t является символом табуляции

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

Я не думаю, что есть какой-то способ просто найти "пробел после 5 цифр", чтобы вы могли просто заменить пробел, не касаясь цифр. Вы должны найти 5 цифр (первая строка), а затем пробел (вторая строка). Затем, хотя это кажется излишним или громоздким, ЗАМЕНИТЕ оригинальную строку из 5 цифр с САМОМ, за которой следует вкладка (вторая строка).

Каждый, кто знает это, забывает, что новички понятия не имеют об этом. Вот почему я говорю это для тебя, мой друг.

Ed Poor Math Tutor и бывший программист в Нью-Йорке

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .