2016-10-14 2 views
1

я в настоящее время этот RegularExpressionValidator бегущегоТранслейтинг RegEx из PHP в Asp.Net RegularExpressionValidator

<asp:RegularExpressionValidator ID="rev_Nachname" runat="server" ControlToValidate="edtNachname" 
          Display="None" ErrorMessage="$InvalidBeginOfStringNonTechnik$Nachname$2" ValidationExpression="^[a-zA-ZÆÄÜÖáâãäåæçèéêëìíîïñòóôõöøùúûüß0-9'-]{2}.*"></asp:RegularExpressionValidator> 

У меня есть требование прямо сейчас, чтобы изменить его в Unicode - латинский и создал следующие RegEx для PHP:

^[\p{Latin}+\p{M}*+0-9'-]{2,} 

После изменения регулярного выражения и развертывания сайта, о котором идет речь, приложение просто запустится в таймаут, если я открою сайт, на котором я изменил Regex. Если я полностью отменил все изменения.

Поскольку я не получаю никаких ошибок, я в темноте, но думаю, что ASP не может справиться с моим RegEx. Есть ли что-то очевидное, почему оно не работает?

Спасибо заранее!

+0

Является ли регулярное выражение только на стороне сервера? Какие точные диапазоны Юникода и символы, которые необходимо сопоставить? Регулярное выражение '^ [\ p {Latin} + \ p {M} * + 0-9 '-] {2,}' соответствует двум или более символам, латинским, плюс, диакритическим, звездочкам, цифрам, апострофе или дефису. –

+0

Мне нужно сопоставить каждое письмо, которое перечислено здесь: http://xoev.de/latinchars/1_1/latinchars.pdf , а также 0-9, ', - Это \ p {M} * + принято отсюда: http://www.regular-expressions.info/unicode.html Часть: Unicode Категории Похоже, что Regexvalidator не нравится \ p {Latin} – user1021605

+0

. Каков диапазон базовой латиницы ? Это всего лишь печатная версия ASCII? Попробуйте '[- ~]' совместить любой символ ASCII. Опять же, регулярное выражение выполняется на сервере или клиенте или и то, и другое? Дело в том, что '\ p' и' * + 'не поддерживаются механизмом регулярных выражений. –

ответ

1

Вы, кажется, хотите, чтобы все категории Юникода имели Latin в их именах. Вот их диапазоны:

| Code point range |  Block name   | 
|--------------------------------------------------| 
| 0000 - 007F  | IsBasicLatin    | 
| 0080 - 00FF  | IsLatin-1Supplement  | 
| 0100 - 017F  | IsLatinExtended-A   | 
| 0180 - 024F  | IsLatinExtended-B   | 
| 1E00 - 1EFF  | IsLatinExtendedAdditional | 
|--------------------------------------------------| 

Таким образом, вы можете создать собственный специальный класс из них и добавить '0-9- к нему, чтобы получить расширенную версию предыдущего регулярного выражения: [\u0000-\u007F\u0080-\u00FF\u0100-\u017F\u0180-024F\u1E00-\u1EFF'0-9-].

Однако текущее регулярное выражение соответствует только началу строки ^, ровно 2 символов из вашего пользовательского класса символа ([...]{2} части), а затем любые 0+, кроме LineBreak символов (.*) сов. Расширенная версия будет выглядеть

^[\u0000-\u007F\u0080-\u00FF\u0100-\u017F\u0180-024F\u1E00-\u1EFF'0-9-]{2}.*  

Если вам нужно разрешить два или более символов из пользовательского класса вашего персонажа, используйте

^[\u0000-\u007F\u0080-\u00FF\u0100-\u017F\u0180-024F\u1E00-\u1EFF'0-9-]{2,}$ 

UPDATE:

Таким образом, получается, вы необходимо поддерживать диакритические элементы из-за пределов плоскости BMP, а также конкретные диапазоны кода кода Unicode, исключая некоторые из них.

^(?:(?:(?:(?![\u0009-\u002F\u003A-\u0040])[a-zA-Z\u006E-\u0302\u006D-\u0302\u004A-\u030C'0-9-])|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])){2,} 

А вот regex demo

Основная часть шаблона (?:(?![\u0009-\u002F\u003A-\u0040])[a-zA-Z\u006E-\u0302\u006D-\u0302\u004A-\u030C'0-9-]), а остальное для согласования диакритических.

+0

Они смогут использовать символы, подобные «одному» с этим регулярным выражением, - я хочу отрицать это, поэтому я не хотел использовать регулярное выражение, которое вы разместили с диапазонами! Есть ли способ предотвратить это без исключения EACH NonLetter в этих диапазонах? Будут ли соответствовать персонажи с двумя кодовыми точками? Например. 0044 + 0302 – user1021605

+0

В JS вы не можете точно соответствовать кодам за пределами плоскости BMP в ES5. В ES6 это проще, но не уверен, что браузеры это поддержат. Обратите внимание, что вы на самом деле не указали, какие * буквы * вам нужны, но я подозреваю, что вы хотите '(?! [× ÷]) [A-Za-zÀ-ÿ]'. См. Http://stackoverflow.com/a/30798598/3832970. Было бы лучше, если бы вы могли предоставить некоторые действительные и недействительные исходные данные для тестирования. –

+0

Они не должны быть согласованы: 0009-002F 003A-0040 Они должны быть согласованы: 006E + 0302 006D + 0302 004A + 030C – user1021605

Смежные вопросы