2016-10-14 205 views
1

我現在有這樣的RegularExpressionValidator運行:翻譯正則表達式從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 - 拉丁語和創建以下的正則表達式PHP:

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

改變正則表達式和部署有問題的網站後 - 應用程序將只運行到超時,如果我開,我改變了正則表達式的網站 - 如果撤消更改萬物的罰款。

由於我沒有收到任何錯誤,我有點在黑暗中 - 但認爲ASP無法處理我的RegEx。 有什麼明顯的爲什麼它不工作?

在此先感謝!

+0

正則表達式僅在服務器端工作嗎?你需要匹配什麼確切的Unicode範圍和字符?你'^ [\ p {}拉丁文+ \ 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 {拉丁語} – user1021605

+0

基本拉丁文的範圍是什麼? ?它只是所有可打印的ASCII碼?嘗試'[ - 〜]'來匹配任何ASCII字符。再次,是服務器或客戶端或兩者上執行的正則表達式?問題的關鍵是,'\ p'和'* +'不是由正則表達式引擎支持。 –

回答

1

你似乎要允許那些在他們的名字拉丁所有Unicode類別。以下是他們的範圍:

| 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+。擴展版本看起來像

^[\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中,您不能在ES5中匹配BMP平面以外的代碼點。在ES6中,這很容易,但不確定瀏覽器會支持。注意你並沒有實際說明你需要什麼*字母,但是我懷疑你想要'(?![×÷])[A-Za-zÀ-ÿ]'。請參閱http://stackoverflow.com/a/30798598/3832970。如果您可以提供一些有效和無效的輸入以供我測試,那將是最好的。 –

+0

這些不匹配: 0009-002F 003A-0040 這些應匹配: 006E + 0302 006D + 0302 004A + 030C – user1021605