2015-07-19 3 views
1

Я работаю над problem 6 on regexone.com, и я не могу понять, как работает группировка с «изменением». Это тест строка:Regex - группа захвата с изменением классов символов

   The quick brown fox... 

и задача состоит в том, чтобы захватить The quick brown fox... без дополнительных пробелов, которые можно сделать с ^\s*([\w\s.]*)\s*$.

Но когда я пытаюсь это:
^\s*(\w|\s|\.)*\s*$ захватывает группа '.' ([27-28]) Почему? И поэтому ^\s*((\w|\s|\.)*)\s*$ захватывает две группы - The quick brown fox... [6-28] и '.' ([27-28]).

Как работает группировка? Каковы различия в работе с изменениями и классами символов, кроме того, что классы символов соответствуют символам, тогда как изменение соответствует словам (мое основное понимание)?

P.S .: Как следует искать документацию, такую ​​как информация о таких проблемах, когда я даже не знаю, что они называли?

ответ

1

^\s*(\w|\s|\.)*\s*$ захватывает группу '.' ([27-28]) Почему?

Причина заключается в том, что захватывая группы хранения текста они совпадают в виде буфера или стека. Коэффициент кванта * позволяет повторному повторному захвату двигателя regex захватывать неограниченное время и записывать в этот буфер каждый буквенно-цифровой или пробельный или точечный каждый раз, когда переписывает значение в буфере.

^\s*((?:\w|\s|\.)*)\s*$ имеет 2 захватив группы, таким образом, он захватывает весь текст в группе 1 (WIH внешней (...)), а вторая группа записи является один, который хранит символы с чередованием соответствует по одному только с последним символ, оставшийся во втором буфере.

Решение будет использовать группу, не связанную с захватом, для чередования и группу захвата для всех найденных подматричек: ^\s*((?:\w|\s|\.)*)\s*$.

Разум очень неэффективен! Используйте классы символов везде, где это возможно (т. Е. ([\w\s.]*)).

+0

Как этот процесс отличается для соответствия класса символов, я имею в виду [abc] * vs (a | b | c) *? – devautor

+0

Когда у вас есть класс символов, он скомпилируется и проверяется за 1 проход. Когда у вас есть чередование, двигатель добавляет дополнительный уровень обратного отсчета, что усложняет задачу и делает код exectute намного медленнее. Сравните информацию об отладке для ['[abc] *'] (https://regex101.com/r/cQ4tF1/1) и ['(a | b | c) *'] (https://regex101.com/ r/cQ4tF1/2) - 3 против 15 шагов. –

0

Каждая группа захвата захватывает строку, соответствующую этой группе. ((\w|\s|\.)*) соответствует The quick..., поэтому он правильно устанавливает захваченную строку. Но (\w|\s|\.) подходит много раз, один раз для каждого персонажа; захваченная строка является последним совпадением, которое является . в конце текста.

Смежные вопросы