2016-08-19 8 views
9

В книге Eloquent JavaScriptchapter 9: Regular Expressions в соответствии с разделом «разборе INI File» есть пример, который включает в себя регулярное выражение, которое я не поймать вообще. Автор пытается разобрать следующий контент:В чем разница между этими двумя регулярными выражениями? (Понимание? Квантор)

searchengine=http://www.google.com/search?q=$1 
spitefulness=9.7 

; comments are preceded by a semicolon... 
; each section concerns an individual enemy 
[larry] 
fullname=Larry Doe 
type=kindergarten bully 
website=http://www.geocities.com/CapeCanaveral/11451 

[gargamel] 
fullname=Gargamel 
type=evil sorcerer 
outputdir=/home/marijn/enemies/gargamel 

О правилах для этого формата состояния,

Пустые строки и строки, начинающиеся с запятой игнорируются.

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

^\s*(;.*)? 

Насколько я понимаю, этот процесс выражения линии, которые могут начинаться с последовательностью

пробельных символов, включая пробел, табуляцию, форму корма, корм линии и другие Unicode пространства

(source) до тех пор, пока не появится запятая ;, а затем последовательность «любой символ, кроме терминаторов строк: \ n, \ r, \ u2028 или \ u2029.". Все это ограничивалось {0,1}.

Я не получаю значение квантификатора ? здесь. Я не могу найти (regex101) в любом случае, когда проблема ограничения строк соответствия не ограничивается. Почему это выражение отличается от этого другого:

^\s*(;.*) 

Заранее спасибо.

ответ

6

^\s*(;.*) требует наличия ;, он не может содержать пустую строку.

^\s*(;.*)? может соответствовать пустой строке, не требуется ;.

Общая часть ^\s* - начало строки (или строки), а затем ноль или более пробелов.

Тогда 1) (;.*) соответствует ; (1 экземпляр в обязательном порядке), а затем ноль или более символы, отличные от символа новой строки, и 2) (;.*)? соответствует опциональной последовательности (The (...)? является необязательной группой, так как ? является квантификатором соответствия один или нуль вхождения квантованного атома, тогда как атом может быть символом, классом символов, группой ) ;, за которым следуют символы 0+, отличные от новой строки.

Кроме того, обратите внимание, что \s совпадает с символами LF и CR, и это означает, что (если модификатор MULTILINE включено, а вход представляет собой текст, содержащий несколько строк) регулярное выражение ^\s* не может соответствовать по несколько линий до первого непробельного персонаж.

+0

Текст на связанной странице говорит, что вход сначала разделяется на строки, поэтому многострочный режим не используется, и для '' '' s '' не должно быть символов новой строки. (Это тоже привлекло мое внимание.) –

+0

Хорошо, я изменил ответ на * (если модификатор MULTILINE включен, а вход - текст, содержащий несколько строк) *. Это общее замечание для будущих читателей. –

+1

Спасибо. Я пропустил, выражение должно было совпадать и для пустых строк. Спасибо, что ответили так быстро. –

2

Ваше модифицированное окончательное регулярное выражение требует: точки с запятой. Исходное регулярное выражение будет соответствовать строкам, которые являются только пробелами.

Поскольку намерение (если я правильно понимаю) состоит в том, чтобы игнорировать строки, соответствующие этому регулярному выражению (как - якобы - строки комментариев), имеет смысл также игнорировать пустые строки.

+0

Спасибо. Ваш комментарий усиливает мое понимание! –