regex найти вопрос содержания - PullRequest
6 голосов
/ 15 июня 2010

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

 joe smith <joesmith@domain.com>

Полученный текст должен быть

 joesmith@domain.com

Использование этого

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

Не повезло. Есть предложения?

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

Ответы [ 3 ]

9 голосов
/ 15 июня 2010

Вы не можете использовать lookbehind с механизмом регулярных выражений CF (использует Apache Jakarta ORO ).

Однако вы можете использовать Регулярное выражение Java , которое поддерживаетих, и я создал оболочку 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.
0 голосов
/ 15 июня 2010

Я никогда не был доволен функциями сопоставления регулярных выражений в 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) />

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

0 голосов
/ 15 июня 2010
/\<([^>]+)\>$/

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...