Использование регулярных выражений в JSP EL
В выражениях EL, используемых на странице jsp, строки берутся буквально. Например, в следующем фрагменте кода
<c:when test="${myvar == 'prefix.*'}">
test не оценивает значение true, если значение myvar является "prefixxxxx". Кто-нибудь знает, есть ли способ, чтобы строка интерпретировалась как регулярное выражение? Есть ли у EL что-то похожее на awk tilde ~ operator?
Ответы
Ответ 1
Хотя этот частный случай можно обрабатывать с помощью функции 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>
Извините, я не тестировал эту конкретную функцию, но я надеюсь, что это достаточно, чтобы указать вам в правильном направлении.
Ответ 2
Вы можете использовать JSTL-функции, например:
<c:when test="${fn:startsWith(myVar, 'prefix')}">
Посмотрите: http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/fn/tld-summary.html
Ответ 3
Просто добавьте следующее в 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
Ответ 4
для использования Pattern.matches внутри jsp-страницы в моем случае этого было достаточно, чтобы позвонить
java.util.regex.Pattern.matches(regexString, stringToCompare), потому что вы не можете импортировать пакет в jsp