2013-11-10 4 views
2

Я читал на MDN, что:Должен ли флаг [m] Regex с флагом [g]?

m flag/multiline : 

Treat начало и конец символов (^ и $), как работают над кратному линии

Так что я сделал тест (http://regexr.com?374jj):

У меня есть это регулярное выражение:

^[\s\S]{3}

Если я не проверить global и multiline:

enter image description here

Если я проверяю только global:

enter image description here

Если я проверить как global + multiline:

enter image description here

Похоже, что multiline работает только с флагом global.

Являются ли мои наблюдения/выводы правильными? Много ли линия должна быть всегда с глобальным?

+1

Нет. Попробуйте выполнить те же тесты с регулярным выражением, которое не соответствует первой строке, например '^ [^ a] [\ s \ S] {2}'. – DCoder

+0

@DCoder, который должен быть ответом, а не комментарием :-) –

+0

@DCoder Я не вижу, как это помогает - вы просто добавили фильтр. (все же каждая строка сравнивается с этим условием) –

ответ

4

m не требует или подразумевает g, no. Рассмотрим:

"foo\nbar".match(/^bar/) // `null` 

против

"foo\nbar".match(/^bar/m) // ["bar"] 

С m флагом, ^bar матчи, потому что ^ матчи в начале линии. Без него совпадения нет, потому что ^ не совпадает в начале строки ввода. Флаг m имеет аналогичный эффект на конце (линия | входной) якорь $.

Флаг g вступает в игру, когда вам нужно выполнить матч более одного раза. Рассмотрим эту разницу, например:

"foo\nbar\nfoo\nbar".replace(/^bar/m, "BAZ") 

... который дает нам:

foo 
BAZ 
foo 
bar

Обратите внимание, что второй матч не был заменен. Сравнение с результатом, если мы добавим g флаг:

"foo\nbar\nfoo\nbar".replace(/^bar/mg, "BAZ") 

... который дает нам:

foo 
BAZ 
foo 
BAZ

Обратите внимание, что все матчи были заменены.

+0

Так почему же (это) [http://regexr.com?374jm] не работает? (все линии) –

+4

@RoyiNamir Потому что он останавливается после первого матча. – plalx

+0

@RoyiNamir: инструмент должен останавливаться с первого совпадения. –

2

Ну, это зависит от того, чего вы пытаетесь достичь. Без флага глобально, вы получите только первое совпадение. Без флага многострочного будет рассмотрена только первая строка.

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