Узгодження лише першого явища в рядку з Regex


42

Я абсолютно новачок у регексе, і я дуже вдячний за будь-яку допомогу.

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

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

Я хотів би замінити першу кому пробілом, а решту комами залишити недоторканими для кожного рядка. Чи є вираз регулярного вираження, який буде відповідати лише першій комі?

Я спробував це: ^.....,. Це відповідає кома, однак вона також відповідає всій довжині рядка, що передує комі, тому, якщо я спробую замінити цю пробіл, всі числа також видаляються.


який інструмент ви використовуєте? (sed, perl, awk, щось інше?)
Мат

Textpad (Windows)
cows_eat_hay

Відповіді:


53

Модель узгодження може бути:

^([^,]+),

Це означає

^        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 /

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


Дивовижно! Дякую Мате, це спрацювало чудово. Насправді це не працювало в Textpad (я думаю, що їх регулярний вимір обмежений), тому я закінчив завантаження PowerGrep, і використовував пошук та заміну з виразом, який ви надали, і він працював чудово. Дякую також за приємне пояснення, воно допомагає зрозуміти, що відбувається.
cows_eat_hay

7
s/,/ /

Це за замовчуванням (тобто без gопції) замінює лише перший збіг.


1
Це насправді текстовий пошук синтаксису пошуку та заміни?
Даніель Бек

1
Це синтаксис sed, perlі деякі інші інструменти.
пабук

3

Це повинно відповідати тільки перше число і кома: ^(\d{5}),. Якщо ви хочете згорнути все інше в рядку, змініть регулярний вираз на це:^(\d{5}),(.*)$


Це теж зробило трюк. Насправді я застосував рішення Мата, але я перевірив і ваше, і воно працює. Дякую за допомогу!
cows_eat_hay

Чому \d{5}і ні [^,]*? Це @ принаймні було б більш загальним.
JustinCB

2

Більш елегантне рішення - використовувати ліниві відповідність:

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

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


Зауважте, що це не буде відповідати рядку, який не містить коми (одне значення у рядку). Зіставлення будь * може бути краще , ніж один , +такs/^(.*?),/\1 /
Джефф Puckett

Ви також можете зробити s/^([^,]*),/\1 /, що відповідатиме початку, що завгодно, не кома, а потім кома. Також ви не знаєте, що s//нічого не змінюється, що не відповідає?
JustinCB

1

TextPad завжди мав можливість використовувати позначення posix, але ви повинні змінити налаштування в іншому діалоговому вікні. Щоб використовувати налаштування TextPad за замовчуванням для регулярних виразів, вам доведеться "уникнути" дужок, що відкриваються та закриваються:

Замініть пробіл після 5-значного поштового індексу на початку кожного рядка

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

За допомогою вкладки

\1\t

Як вище, ^ означає початок рядка

\ (є "втеченою дужкою" і позначає початок першого пошукового виразу, тобто п'яти цифр

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

\) - ще одна "втечала дужка" для позначення кінця першого пошукового виразу

[] - це просто пробіл (ви можете залишити дужки, але тоді ніхто не зможе його побачити на цій веб-сторінці :-)

У виразі заміни

\ 1 - перший вираз пошуку, частина між дужками вище (одна або кілька цифр)

\ t - символ символів

Таким чином, команда пошуку та заміни шукає одну чи кілька цифр, а потім пробіл. Потім він замінює все те на ту саму групу цифр, за якою йде вкладка.

Я не думаю, що існує спосіб просто знайти «пробіл, який з’являється після 5 цифр», тож ви можете просто замінити пробіл, не торкаючись цифр. Ви повинні знайти 5 цифр (перша рядок), а потім пробіл (другий рядок). Тоді, хоча це здається зайвим або громіздким, ЗАМІНІТЬ початковий рядок у 5 цифр ITSELF, а потім вкладку (другий рядок).

Усі, хто це знає, забувають, що новачки не мають про це уявлення. Ось чому я це написав для вас, друже.

Ед Поор Математичний Репетитор та пенсійний програміст з комп’ютерів у Нью-Йорку


0

Щоб відповідати лише першому виникненню будь-якого вираження регулярного вираження, видаліть усі прапори. Кожен вираз регулярного вираження має наступні можливі прапори і, як правило, за замовчуванням використовує глобальний прапор, який буде відповідати більш ніж одному події:

  • / g = За допомогою цього прапора пошук шукає всі збіги, без нього - повертається лише перша відповідність
  • / i = регістр нечутливий
  • / m = багаторядковий режим
  • / s = всі. відповідати символу нового рядка \ n
  • / u = unicode
  • / y = липкий режим (пошук у певному місці)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.