Попытка использовать regex повторно находит, что тег находит содержание в скобках в этом примере с помощью coldfusion
joe smith <joesmith@domain.com>
Получающийся текст должен быть
joesmith@domain.com
Используя это
<cfset reg = refind(
"/(?<=\<).*?(?=\>)/s","Joe <joe@domain.com>") />
Не наличие любой удачи. Какие-либо предложения?
Возможно, проблема синтаксиса, это работает в regex тестере онлайн, который я использую.
Вы не можете использовать 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.
Я никогда не был доволен функциями сопоставления регулярных выражений в 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-й группе, определенной в регулярном выражении - все последующие группы также будут захвачены и включены в массив).
/\<([^>]+)\>$/
что-то в этом роде, хотя не проверял, это твое;)