Использование регулярных выражений в JSP EL - PullRequest
11 голосов
/ 17 ноября 2008

В выражениях EL, используемых на странице jsp, строки воспринимаются буквально. Например, в следующем фрагменте кода

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

test не оценивает значение true, если значение myvar равно «prefixxxxx» Кто-нибудь знает, есть ли способ интерпретировать строку как регулярное выражение? Есть ли в EL что-то похожее на оператор тильки ~ в awk?

Ответы [ 4 ]

19 голосов
/ 17 ноября 2008

Хотя этот особый случай можно обработать с помощью функции JSTL fn:startsWith, регулярные выражения в целом кажутся очень вероятными тестами. К сожалению, JSTL не включает функцию для них.

С другой стороны, довольно легко написать функцию EL, которая делает то, что вы хотите. Вам нужна реализация функции и TLD, чтобы ваше веб-приложение узнало, где его найти. Сложите их вместе в JAR-файл и поместите в каталог WEB-INF / 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 / X-c.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>

Извините, я не тестировал эту конкретную функцию, но надеюсь, этого достаточно, чтобы указать вам правильное направление.

7 голосов
/ 23 октября 2013

Просто добавьте следующее в WEB-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>

Тогда в вашем JSP

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

Это будет работать точно так же, как Pattern.match

5 голосов
/ 17 ноября 2008

Вы можете использовать функции JSTL, например, так:

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

Взгляните: http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/fn/tld-summary.html

0 голосов
/ 05 октября 2017

для использования Pattern.matches внутри страницы JSP в моем случае было достаточно позвонить java.util.regex.Pattern.matches (regexString, stringToCompare), потому что вы не можете импортировать пакет в jsp

...