2010-06-15 30 views
6

Cố gắng sử dụng thẻ refind regex để tìm nội dung trong dấu ngoặc trong ví dụ này sử dụng Coldfusionregex tìm câu hỏi nội dung

joe smith <[email protected]> 

Các văn bản kết quả nên

[email protected] 

Sử dụng này

<cfset reg = refind(
"/(?<=\<).*?(?=\>)/s","Joe <[email protected]>") /> 

Không có may mắn. Bất kỳ đề xuất?

Có thể có vấn đề về cú pháp, nó hoạt động trong trình kiểm tra regex trực tuyến tôi sử dụng.

+0

Làm thế nào về bạn cho chúng tôi biết những gì bạn đã thử và không hoạt động? Nó dễ dàng hơn để đi từ đó ... – jhwist

Trả lời

9

Bạn không thể sử dụng giao diện với công cụ regex của CF (sử dụng Apache Jakarta ORO).

Tuy nhiên, bạn có thể sử dụng Java's regex mặc dù, chúng hỗ trợ chúng và tôi đã tạo CFC bao bọc để làm cho việc này trở nên dễ dàng hơn. Cung cấp bởi: http://www.hybridchill.com/projects/jre-utils.html

(Cập nhật:.. Các CFC wrapper nêu trên đã phát triển thành một dự án đầy đủ Xem cfregex.net để biết chi tiết)

Ngoài ra, /.../s thứ isn' t yêu cầu/có liên quan ở đây.

Vì vậy, từ ví dụ của bạn, nhưng với cải tiến regex:

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

<cfset reg = jrex.match("(?<=<)[^<>]+(?=>)" , "Joe <[email protected]>") /> 


Một lưu ý nhanh chóng, vì tôi đã cập nhật rằng regex một vài lần; hy vọng nó tốt nhất bây giờ ...

(?<=<) # 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

Bạn là một thiên tài Peter. Điều này hoạt động tốt .. Cảm ơn sự giúp đỡ – jeff

-1
/\<([^>]+)\>$/ 

một cái gì đó như thế, không kiểm tra nó mặc dù, bạn của một mà;)

0

Tôi chưa bao giờ hài lòng với biểu hiện thường xuyên phù hợp với chức năng trong CF. Do đó, tôi đã viết của riêng tôi:

<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> 

Áp dụng cho vấn đề của bạn, đây là ví dụ của tôi:

<cfset origString = "joe smith <[email protected]>" /> 
<cfset regex = "<([^>]+)>" /> 
<cfset matches = reFindNoSuck(regex, origString) /> 

bán phá giá là "phù hợp" biến cho thấy rằng nó là một mảng với 2 mặt hàng này. Đầu tiên sẽ là <[email protected]> (vì nó khớp với toàn bộ regex) và thứ hai sẽ là [email protected] (vì nó khớp với nhóm thứ nhất được xác định trong cụm từ thông dụng - tất cả các nhóm tiếp theo cũng sẽ được chụp và đưa vào mảng).

+1

Cảm ơn Adam, tôi đã có thể sử dụng wrapper Peter phát triển, nhưng cảm ơn cho hai xu của bạn là tốt. – jeff