2008-11-17 21 views
11

में नियमित अभिव्यक्तियों का उपयोग करके ईएल अभिव्यक्तियों में, एक जेएसपी पृष्ठ में उपयोग किया जाता है, तारों को शाब्दिक रूप से लिया जाता है। उदाहरण के लिए, निम्न कोड में झलकीजेएसपी ईएल

<c:when test="${myvar == 'prefix.*'}"> 

परीक्षण सच का मूल्यांकन नहीं करता है तो myVar का मान 'prefixxxxx।' क्या किसी को पता है कि स्ट्रिंग को इसके बजाय रेगेक्स के रूप में व्याख्या करने का कोई तरीका है या नहीं? क्या ईएल के पास awk के tilde ~ ऑपरेटर के समान कुछ है?

उत्तर

5

तुम इतनी तरह JSTL कार्यों का उपयोग कर सकते हैं -

<c:when test="${fn:startsWith(myVar, 'prefix')}"> 

एक नज़र डालें: http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/fn/tld-summary.html

+1

यह ओप (और मेरा) प्रश्न का उत्तर नहीं देता है: _ "क्या किसी को पता है कि स्ट्रिंग को इसके बजाय रेगेक्स के रूप में व्याख्या करने का कोई तरीका है?" _ – Madbreaks

19

इस विशेष मामले JSTL fn:startsWith समारोह के साथ संभाला जा सकता है, सामान्य रूप में नियमित अभिव्यक्ति बहुत संभावना परीक्षण की तरह लग । यह दुर्भाग्यपूर्ण है कि जेएसटीएल में इनके लिए कोई फ़ंक्शन शामिल नहीं है।

चमकदार तरफ, एक ईएल फ़ंक्शन लिखना बहुत आसान है जो आप चाहते हैं। आपको फ़ंक्शन कार्यान्वयन की आवश्यकता है, और एक टीएलडी आपके वेब एप्लिकेशन को यह कहने के लिए कहां मिलना है। इन्हें एक साथ जार में रखें और इसे अपने वेब-आईएनएफ/lib निर्देशिका में छोड़ दें।

यहाँ एक रूपरेखा है:

कॉम/एक्स/taglib/कोर/Regexp.java:

import java.util.regex.Pattern; 

public class Regexp { 

    public static boolean matches(String pattern, CharSequence str) { 
    return Pattern.compile(pattern).matcher(str).matches(); 
    } 

} 

META-INF/xc.tld:

<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> 
    <tlib-version>1.0</tlib-version> 
    <short-name>x-c</short-name> 
    <uri>http://dev.x.com/taglib/core/1.0</uri> 
    <function> 
    <description>Test whether a string matches a regular expression.</description> 
    <display-name>Matches</display-name> 
    <name>matches</name> 
    <function-class>com.x.taglib.core.Regexp</function-class> 
    <function-signature>boolean matches(java.lang.String, java.lang.CharSequence)</function-signature> 
    </function> 
</taglib> 

क्षमा करें, मैं नहीं था इस विशेष कार्य का परीक्षण न करें, लेकिन मुझे आशा है कि आपको सही दिशा में इंगित करने के लिए पर्याप्त है।

5

बस अपने jsp

<%@taglib uri="http://www.acme.com.au" prefix="custom"%> 
custom:matches('aaa.+', someVar) } 

में वेब-INF/tags.tld

<?xml version="1.0" encoding="ISO-8859-1" ?> 
    <taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"> 

    <display-name>Acme tags</display-name> 
    <short-name>custom</short-name> 
    <uri>http://www.acme.com.au</uri> 
     <function> 
     <name>matches</name> 
     <function-class>java.util.regex.Pattern</function-class> 
     <function-signature>boolean matches(java.lang.String, java.lang.CharSequence) </function-signature> 
    </function> 
</taglib> 

तब के लिए निम्न जोड़ने यह काम करेंगे ठीक उसी रूप में Pattern.match

+0

सर्वश्रेष्ठ समाधान आईएमओ! –

+0

चालाक समाधान! लेकिन मैच परिणाम वापस करना संभव होगा। मैंने java.util.regex.Matcher क्लास के साथ कुछ करने की कोशिश की लेकिन मुझे यह tld-syntax के साथ काम करने के बारे में पता नहीं है ... – user2718671

0

पैटर्न का उपयोग कर के लिए। मेरे मामले में एक जेएसपी पेज के अंदर मैच java.util.regex.Pattern.matches (regexString, stringToCompare) को कॉल करने के लिए पर्याप्त था क्योंकि आप आयात नहीं कर सकते जेएसपी

+0

नोट किया जाना चाहिए कि यह संभव नहीं था जब तक कि ईएल 2.2 जारी नहीं हुआ था और सवाल था इससे पहले एक साल से अधिक पूछा। – BalusC

+0

@ बालससी आप बिल्कुल सही हैं, मैंने अभी साझा किया है कि हर कोई अब खोज रहे हैं :) – Giuseppe

संबंधित मुद्दे