Кто-нибудь может объяснить этот шаблон Regex? - PullRequest
1 голос
/ 28 декабря 2011

Я изучал Regex / grep из руководства BBEdit, и он прошел гладко, за исключением этой части (она близка к концу, и в отличие от предыдущих разделов не дает объяснения).

Две большие части, с которыми я сталкиваюсь, это часть [^] и первая часть ^ (. *)

Во-первых, это говорит что-то кроме пробела? Как тогда поймать X. Поттера с пробелом после X.?

Во-вторых, в руководстве говорилось о не жадных квалификаторах, которые использовались так, чтобы не соответствовать самому длинному шаблону по умолчанию и случайно соответствовать вашей полной фразе. Как ^ (. *) Не соответствует полной строке и делает ее \ 1? Начало строки, ноль или более вхождений чего-либо, кроме возврата каретки? Как это не ловит Джуниора X. Поттера как один образец? Я думал, что здесь нам придется использовать некожадный классификатор, но, похоже, нет.

И, наконец, что именно пробелы делают в шаблоне регулярного выражения? Они представляют себя (я думал, вам нужно \ t, чтобы сделать это?) Или простой пробел (не нужно делать \ space , чтобы избежать этого).

Rearranging Name Lists
You can use grep patterns to transform a list of names in first name first form to last name first order (for a later sorting, for instance). Assume that the names are in the form:
 Junior X. Potter
   Jill Safai
   Dylan Schuyler Goode
   Walter Wang
If you use this search pattern:
 ^(.*) ([^ ]+)$
And this replacement string:
\2, \1
The transformed list becomes:
 Potter, Junior X.
   Safai, Jill
   Goode, Dylan Schuyler
   Wang, Walter

Ответы [ 5 ]

3 голосов
/ 28 декабря 2011

На модификаторе * и жадности:

.* настолько жаден, насколько это возможно.Но регулярное выражение хочет добиться успеха, поэтому оно будет выполнять различные действия (обратный путь и т. Д.), Чтобы по-прежнему ограничивать количество съедаемого *.

В общем, .* следует считать «0 символов, вплоть до самых возможных символов, которые все еще позволят успешной работе остальной части шаблона. ”

Различие между Жадным .* и Нежадным .*? демонстрируется:

    "A B C D"

    /^(.*) /   → "A B C"
    /^(.*?) /  → "A"
3 голосов
/ 28 декабря 2011

[^ ] означает «любой символ, кроме пробела»

^(.*) означает «С начала строки, группа всех символов»

Итак, (. *) захватывает первый пробел между "младшим" ​​и "X".

Я думаю, что [^] удерживает первую группу от слишком жадного.Не совсем уверен в этом.

Пробел - это символ, как и любой другой.\ t обычно является символом табуляции.

2 голосов
/ 28 декабря 2011

На английском языке ваше регулярное выражение ^(.*) ([^ ]+)$ говорит: «Сопоставьте каждую строку, содержащую ровно несколько данных (или ни одного), за которыми следует пробел, за которым следует 1 или более непробелов».

некоторые данные записываются в подшаблон 1 (.*)
1 или более непробелов записывается в подшаблон 2 ([^ ]+)

Это данные, сгруппированные в соответствующие подшаблоны:

(Junior X.) (Potter)
(Jill) (Safai)
(Dylan Schuyler) (Goode)
(Walter) (Wang)

Что касается ваших вопросов:

  1. Да, [^ ] соответствует любому символу, кроме пробела. Это не соответствует «X. Поттер», вы можете видеть из преобразования, что «Junior X». соответствует подшаблону 1, тогда как «Поттер» соответствует подшаблону 2.

  2. Использование ^ и $ означает, что вы сопоставляете всю строку (^ обозначает начало строки, а $ обозначает конец). Первый шаблон (.*) является жадным, но остальная часть вашего регулярного выражения утверждает, что у вас должен быть пробел, и он должен заканчиваться хотя бы одним непробельным символом, поэтому (.*) соответствует как можно большему количеству символов. все еще удовлетворяя условиям полного регулярного выражения.

2 голосов
/ 28 декабря 2011

^(.*) означает совпадение чего угодно от начала строки до пробела ...

([^ ]+)$ НО - не просто пробел, а конкретный пробел, за которым следуют 1 или более непробельных символов, затем конец строки. «Непробельные символы до конца строки» будут второй подходящей группой.

Таким образом, человек будет обрабатывать это в обратном порядке: найдите группу непробельных символов в конце строки «Поттер», и вы найдете совпадение / 2. Ах-ха, есть предшествующий пробел, затем все, что перед этим, соответствует / 1, "Junior X".

Редактировать : пробел представляет собой себя, его не нужно экранировать. Поэтому будьте осторожны, чтобы не вставлять пробелы для предварительного выражения вашего регулярного выражения - это действительно что-то значит.

2 голосов
/ 28 декабря 2011

Символ карата (^) в регулярных выражениях немного сбивает с толку, он имеет два значения:

1) При использовании в начале выражения он соответствует началу строки.Так

 ^a would mean any lines that begin with a

2) При использовании внутри селектора символов это означает комплимент символов (т. Е. Все символы, кроме этих символов). Итак:

[^xyz] означает совпадение символа с чем угодно, КРОМЕ xили y или z

[^a-z]+ означает совпадение с одним или несколькими символами, которые совпадают с чем угодно, кроме букв нижнего регистра

Надеюсь, это поможет.

Один из лучших уроков - http://www.proftpd.org/docs/howto/Regex.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...