Почему это регулярное выражение не работает в REFind()?

Я хочу найти строку, чтобы убедиться, что она не содержит цифр или неалфавитных символов. Из моего предыдущего вопроса здесь было предложено решение Regex, которое, похоже, работает с использованием инструментов онлайн-тестирования. Но я не могу заставить его работать в этом формате:

<cfif REFindNoCase(".*?\\P{IsAlphabetic}.*", FORM.Forename)>
<p>Error, your name contains illegal characters</p>
</cfif>

Он просто пропускает недопустимые строки, не обнаруживая недопустимые символы. Таким образом, myname1977 кажется пропущенным без отображения сообщения об ошибке. Что я делаю не так?


person volume one    schedule 16.07.2015    source источник
comment
Попробуйте: REFind(".*?\P{IsAlphabetic}.*", FORM.Forename)   -  person anubhava    schedule 16.07.2015


Ответы (1)


Движок Reg Exp, который использует ColdFusion, не обладает всей мощью Java. Что-то вроде этого должно сделать это за вас:

<cfscript>
input = "विकिपीडि";
writeDump(isValidUsername(input));// YES

input = "विकिपीडि7";
writeDump(isValidUsername(input));// NO

input = "hello";
writeDump(isValidUsername(input));// YES

input = "hel lo";
writeDump(isValidUsername(input));// NO

input = "hello7";
writeDump(isValidUsername(input));// NO


function isValidUsername(input) {
    var pattern = ".*?\P{IsAlphabetic}.*";
    var Matcher = createObject( "java", "java.util.regex.Pattern" )
        .compile( javaCast( "string", pattern ) )
        .matcher( javaCast( "string", input ) );

    return !Matcher.matches();
}
</cfscript>

Обновить

Я разместил это в комментариях, но может быть полезно, поэтому добавьте его в ответ, если это представляет интерес:

Если вы выполняете простое сопоставление, тогда строки в Java имеют встроенную поддержку Reg Exp, поэтому вы должны просто сделать это: mystring.matches(".*?\P{IsAlphabetic}.*"); Версия createObject более «надежна», поскольку CF может изменить что-то в будущем, что сломает ее.

person John Whish    schedule 16.07.2015
comment
Существует ли эквивалентное регулярное выражение, которое будет работать с собственным механизмом регулярных выражений CF? - person volume one; 16.07.2015
comment
@volumeone — убедитесь, что они делают то же самое. Я не использовал его, поэтому я не уверен. - person Leigh; 16.07.2015
comment
@ Ли, к сожалению, нет, я проверял, и это не работает - person volume one; 16.07.2015
comment
@volumeone - Вы хотите использовать функцию CF потому, что у вас нет доступа к createObject? Если да, добавьте это ограничение в свой вопрос, чтобы оно было более заметным. - person Leigh; 16.07.2015
comment
@Ли, у меня есть доступ к CreateObject. Я просто пытался сделать свой код немного проще, вот и все. Мало что меняет в общей схеме вещей - person volume one; 16.07.2015
comment
@volumeone - Попался, но иногда необходимо использовать java. Учитывая, что внутри CF используется более старая библиотека регулярных выражений, это может быть одним из таких случаев. Если вы выполните поиск в архивах SO, вы увидите, что есть некоторые функции Unicode, которые вы можете дублировать с помощью функций CF. Однако и они имеют ограничения. Итак, опять же, вполне возможно, что здесь может не быть нативного эквивалента CF. (Конечно, под капотом все равно java ;-) - person Leigh; 16.07.2015
comment
Если вы выполняете простое сопоставление, тогда строки в Java имеют встроенную поддержку Reg Exp, поэтому вы должны просто сделать это: mystring.matches(".*?\P{IsAlphabetic}.*"); Версия createObject более «надежна», поскольку CF может изменить что-то в будущем, что сломает ее. - person John Whish; 16.07.2015
comment
Спасибо, метод match() отлично подходит для моих нужд. Просто из интереса - создание объекта Java использует больше ресурсов, чем использование только встроенных методов CF? - person volume one; 17.07.2015
comment
Не эксперт в этом, но я ожидаю, что он создаст один новый экземпляр, который будет собирать мусор, поэтому я буду удивлен, если вы заметите какое-либо влияние на производительность. - person John Whish; 17.07.2015
comment
@volume one — CreateObject создает прокси для java-объектов. Так что теоретически им может потребоваться немного больше ресурсов. Вам придется профилировать его, чтобы увидеть, измеримы ли они. Я предполагаю, что нет. Методы Java, как правило, немного медленнее из-за использования отражения, но опять же, в большинстве случаев это обычно не заметно. - person Leigh; 24.07.2015