regex находят вопрос о содержании

Попытка использовать regex повторно находит, что тег находит содержание в скобках в этом примере с помощью coldfusion

 joe smith <joesmith@domain.com>

Получающийся текст должен быть

 joesmith@domain.com

Используя это

<cfset reg = refind(
 "/(?<=\<).*?(?=\>)/s","Joe <joe@domain.com>") />

Не наличие любой удачи. Какие-либо предложения?

Возможно, проблема синтаксиса, это работает в regex тестере онлайн, который я использую.

6
задан Peter Boughton 15 June 2010 в 16:56
поделиться

3 ответа

Вы не можете использовать lookbehind с regex движком CF (используется Apache Jakarta ORO).

Однако, вы можете использовать Java's regex, который поддерживает их, и я создал обертку CFC, которая делает это еще проще. Доступно по адресу: http://www.hybridchill.com/projects/jre-utils.html

(Обновление: упомянутая выше CFC-обертка превратилась в полноценный проект. См. cfregex.net для подробностей.)

Кроме того, /.../s здесь не требуется/не имеет значения.

Итак, из вашего примера, но с улучшенным регексом:

<cfset jrex = createObject('component','jre-utils').init()/>

<cfset reg = jrex.match( "(?<=<)[^<>]+(?=>)" , "Joe <joe@domain.com>" ) />


Небольшое замечание, поскольку я обновлял этот регекс несколько раз; надеюсь, сейчас он в лучшем виде...

(?<=<) # positive lookbehind - start matching at `<` but don't capture it.
[^<>]+ # any char except  `<` or `>`, the `+` meaning one-or-more greedy.
(?=>)  # positive lookahead - only succeed if there's a `>` but don't capture it.
9
ответ дан 16 December 2019 в 21:34
поделиться

Я никогда не был доволен функциями сопоставления регулярных выражений в CF. Следовательно, я написал свой собственный:

<cfscript>
    function reFindNoSuck(string pattern, string data, numeric startPos = 1){
        var sucky = refindNoCase(pattern, data, startPos, true);
        var i = 0;
        var awesome = [];

        if (not isArray(sucky.len) or arrayLen(sucky.len) eq 0){return [];} //handle no match at all
        for(i=1; i<= arrayLen(sucky.len); i++){
            //if there's a match with pos 0 & length 0, that means the mime type was not specified
            if (sucky.len[i] gt 0 && sucky.pos[i] gt 0){
                //don't include the group that matches the entire pattern
                var matchBody = mid( data, sucky.pos[i], sucky.len[i]);
                if (matchBody neq arguments.data){
                    arrayAppend( awesome, matchBody );
                }
            }
        }
        return awesome;
    }
</cfscript>

Применительно к вашей проблеме, вот мой пример:

<cfset origString = "joe smith <joesmith@domain.com>" />
<cfset regex = "<([^>]+)>" />
<cfset matches = reFindNoSuck(regex, origString) />

Сброс переменной "matches" показывает, что это массив с 2 элементами. Первый будет (потому что он соответствует всему regex), а второй будет joesmith@domain.com (потому что он соответствует 1-й группе, определенной в регулярном выражении - все последующие группы также будут захвачены и включены в массив).

0
ответ дан 16 December 2019 в 21:34
поделиться
/\<([^>]+)\>$/

что-то в этом роде, хотя не проверял, это твое;)

-1
ответ дан 16 December 2019 в 21:34
поделиться
Другие вопросы по тегам:

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