Различие между модификаторами регулярного выражения 'm' и'?

Лучше всего использовать библиотеку тегов, поскольку создание экземпляра службы непосредственно в представлении через загрузчик классов НЕ БУДЕТ автоматически связывать другие объявленные службы, которые могут жить в службе, которую вы пытаетесь использовать.

Используя библиотеку тегов, вы будете автоматически подключать эти службы.

В вашем представлении gsp <g:customTag param1="$modelObjec" param2="someString" />

В вашей папке taglib (yourApp/grails-app/taglib/com/something/MyAppTagLib):

package com.something

class MyAppTagLib {

    def myService  // This will be auto-wired

    def customTag = { attribs ->
        def modelObj = attribs['param1']
        def someString = attribs['param2']

        // Do something with the params

        myService.method()

        out << "I just used method of MyService class"
    }
}

MyService:

package com.something

class MyService {

def anotherService // This will be auto-wired

def method() {
    anotherService.anotherMethod()
}

}
20
задан José Castro 13 July 2016 в 18:47
поделиться

3 ответа

Нередко можно встретить человека, который годами использует регулярные выражения, но до сих пор не понимает, как работают эти два модификатора. Как вы заметили, названия «многострочный» и «однострочный» не очень полезны. Похоже, они должны быть взаимоисключающими, но они полностью независимы. Я предлагаю вам игнорировать имена и сосредоточиться на том, что они делают: m изменяет поведение якорей ( ^ и $ ) и s изменяет поведение точки (. ).

Одним из известных людей, перепутавших режимы, является автор Ruby. Он создал свою собственную реализацию регулярного выражения на основе Perl, за исключением того, что он решил, что ^ и $ всегда будут привязками к строкам, то есть многострочный режим всегда включен. К сожалению, он также неправильно назвал режим «точка соответствует всему» многострочным . Итак, Ruby не имеет модификатора s , но его модификатор m делает то же, что s делает в других вариантах.

Что касается постоянного использования / ism , не рекомендую. Как вы выяснили, в основном это безвредно, но сбивает с толку всех, кто пытается выяснить, что должно делать регулярное выражение (или даже самому себе в будущем).

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

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

20
ответ дан 30 November 2019 в 00:31
поделиться

может так, я никогда не буду забудьте:

, когда я хочу сопоставить несколько строк (обычно используя. *?, чтобы сопоставить что-то, что не имеет значения, если оно охватывает несколько строк), Я, естественно, буду думать о многострочности и, следовательно, о «м». Ну, на самом деле «м» не тот, поэтому это «s».

(поскольку я уже так хорошо помню «изм» ... так что я всегда могу помнить, что это не «м», то это должно быть 's').

другая неудачная попытка включает:

s для DOTALL, это для DOT, чтобы соответствовать ВСЕМ.
m является многострочным - это для ^ и $ , чтобы совпадать много раз.

1
ответ дан 30 November 2019 в 00:31
поделиться

Мне нравится объяснение в 'man perlre':

m Обрабатывать строку как m конечных строк.
s Обрабатывать строку как s одна строка.

При использовании нескольких строк ^ и $ применяются к отдельным строкам (т.е. непосредственно перед и после новой строки).
В одной строке ^ и $ применяются ко всему, а \ n просто становится другим символом, который вы можете сопоставить.

[Неправильно] Используя m и s, как вы описали, я ожидаю, что второй будет иметь приоритет, поэтому вы всегда будете в многострочном режиме с /ism.[1150444 visible[/Неверно ]

Я недостаточно читал:
Оба модификатора «/ s» и «/ m» имеют приоритет над параметром $ *. То есть, независимо от того, что содержит $ *, «/ s» без «/ m» заставит «^» соответствовать только в начале строки, а «$» - только в конце (или непосредственно перед новой строкой в конец) строки. Вместе, как / ms, они разрешают "." соответствует любому символу, но при этом позволяет «^» и «$» совпадать, соответственно, сразу после и непосредственно перед символом новой строки в строке.

10
ответ дан 30 November 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: