#regex
Вопрос:
Я работаю над заданием для класса, и нам нужно отформатировать эти данные. Я думал, что регулярные выражения были бы очень элегантным способом форматирования данных. Но я столкнулся с некоторыми проблемами. Это мой первый раз, когда я делаю это раньше, и я не знаю, как правильно разделить данные. Я хочу, чтобы начало первой цифры было первым разделом, первая цифра до следующего пробела была вторым разделом, а там до конца строки-третьим разделом. Вот мои данные:
Amber-Rose Bowen 53 123 Machinery Rd.
Joyce Kirkland 19 234 Cylinder Dr.
Seb Dotson 32 3456 Surgery Ln.
Dominique Hough 58 654 Election Rd.
Yasemin Mcleod 29 555 Cabinet Ave.
Nancy Lord 80 232 Highway Rd.
Tracy Mckenzie 72 101 Device Ave.
Alistair Salter 25 109 Guitar Ln.
Adeel Sears 42 222 Solitare Rd.
Я использую https://regex101.com/ чтобы проверить мои идеи. ([a-zA-Z] )([0-9] )
это мое начало, но я не знаю, как перейти от начала к первой цифре. (или любая другая часть этого)
Комментарии:
1. Воспользуйся
^(D )s (d )s (. )$
. ДЕМОНСТРАЦИЯ .
Ответ №1:
Вы можете использовать
^(.*?)[^Srn] (d )[^Srn] (S.*)
Смотрите демонстрацию регулярных выражений. Это регулярное выражение также можно использовать с многострочным флагом для извлечения данных из многострочной строки.
Подробные сведения:
^
— начало строки(.*?)
— Группа 1: любые нулевые или более символов, кроме символов разрыва строки, как можно меньше[^Srn]
— ноль или более горизонтальных пробелов (в некоторых вариантах регулярных выражений вы можете использоватьh
или[^p{Zs}t]
вместо этого)(d )
— Группа 2: одна или несколько цифр[^Srn]
— один или несколько горизонтальных пробелов(S.*)
— Группа 3: символ без пробелов, а затем остальная часть строки.
Комментарии:
1. Спасибо! Это именно то, что я искал. Является ли $ эквивалентом ^ для конца?
2. @IanD
$
соответствует концу строки.^
соответствует началу строки.
Ответ №2:
Если вы просто хотите разделить строку на полное имя, возраст и адрес, вы можете разделить строку на совпадения регулярного выражения
(?i)(?<=[a-z]|d) (?=d)
Например:
Amber-Rose Bowen 53 123 Machinery Rd.
^ ^^^^
Регулярное выражение гласит: «сопоставьте один или несколько пробелов, перед которыми стоит буква или цифра, а затем цифра». (?i)
заставляет совпадение буквы быть безразличным к регистру. (?<=[a-z]|d)
это позитивный взгляд назад; (?=d)
это позитивный взгляд вперед.
Вы можете использовать следующее регулярное выражение, если хотите извлечь имя, фамилию, возраст, номер улицы и название улицы.
^(?<first_name>S ) (?<last_name>S ) (?<age>d ) (?<street_nbr>d ) (?<stret_name>.*)
Например:
Amber-Rose Bowen 53 123 Machinery Rd.
^^^^^^^^^^ ^^^^^ ^^ ^^^ ^^^^^^^^^^^^^
1 2 3 4 5
1: first_name
2: last_name
3: age
4: street_nbr
5: street_name
Я использовал механизм регулярных выражений PCRE с именованными группами захвата. Выражение будет аналогичным для других механизмов регулярных выражений, хотя некоторые из них не поддерживают именованные группы, и в этом случае вам придется использовать нумерованные группы (группа 1, группа 2 и т. Д.).
Обратите внимание, что это работает только из-за согласованной структуры ваших данных. В реальной жизни некоторые строки могут содержать такие вещи, как отчество или номера квартир, что усложнило бы разбор строк.