2017-03-08 72 views
3

我有一個困難的用戶輸入驗證問題(或者至少對我來說很困難)。我試圖確保用戶輸入一個允許的Angular表達式的預定義子集,如果他們試圖將角度添加到他們的輸入。我目前使用http://www.regexpal.com/使用正則表達式驗證段落輸入中的角度表達式

(實際執行中使用JavaScript的HTML網頁)來測試我的表情和以下兩種情況:

VALID

Any text, punctuation (except double-{), or numb3r5 {{model.variable|phone}} is valid 
Any text, punctuation (except double-{), or numb3r5 {{model.variable}} is valid. 
Stick with the format {{model.variable|zipcode}} and we remain valid. 

無效

Any text, punctuation (except double-{), or numb3r5 {{model.variable|phone}} is valid 
Any text, punctuation (except double-{), or numb3r5 {{model.variable}} is valid. 
Any deviation from the format, e.g. {{model.variable|custom}} makes the entire input invalid. 

我想通過正則表達式來識別三個角度塊,並且與「自定義」塊不匹配...

{{model\.[^}|]+(\|((ein)|(phone)|(zipcode)|(currency:'':0)){1})?}} 

......但我不能得到它來強制執行該正則表達式。我在lookaheads上嘗試了很多變體,這是我認爲我需要的,但它與有效輸入不匹配,所以很顯然,我已關閉。

^(((.(?!({{)|(}})))*({{model\.[^}|]+(\|((ein)|(phone)|(zipcode)|(currency:'':0)){1})?}}))?)+$ 

有沒有人知道我可以驗證這個輸入?

回答

3

很好地組成的問題。你描述了這個問題以及你所嘗試過的。

使用Lookaheads是一種解決方案,但您最終可能會將文本用於其他目的,因此正常組在此處工作正常。

我建議:^((?:^|[^\r\n\{]*)(?:\{(?:[^{]|$)|(?:\{{2}model\.variable(?:\|(?:(ein)|(phone)|(zipcode)|(currency:'':0)))?\}{2}|$)))+$demo

要知道,可見空字符串可以通過這個正則表達式。我會做一個.trim().length檢查,如果這是一個問題。我認爲在這個正則表達式中增加更多的膨脹是不合適的。

^       # Anchors to beginning of string or line, 
          # depending on multinline flag 
(      # Opens capturing group 1 
    (?:      # Opens noncapturing group 
    ^     # Anchors to the beginning of string or line 
    |      # or 
    [^\r\n\{]*   # Any character but carriage return, new line, {, one or more times 
)      # Closes noncapturing group 
    (?:      # Opens noncapturing group 
    \{     # Literal { 
    (?:     # Opens noncapturing group 
     [^{]    # Any character but { 
          # to filter {{'ss 
    |      # or 
     $     # End of string or line 
    )      # Closes noncapturing group 
    |      # or 
    (?:     # Opens noncapturing group 
     \{{2}    # {, twice 
     model\.variable  # model.variable 
     (?:     # Opens noncapturing group 
     \|    # Literal | 
     (?:    # Opens noncapturing group 
      (ein)   # ein as capturing group 2 
     |     # or 
      (phone)   # phone as capturing group 3 
     |     # or 
      (zipcode)  # zipcode as capturing group 4 
     |     # or 
      (currency:'':0) # currency as capturing group 5 
     )     # closes non-capturing group 
    )?     # closes non-capturing group, iternates 0 or 1 times 
     \}{2}    # }, twice 
    |      # or 
     $     # end of string or line, dependong on multiline 
    )      # 
)      # 
)+      # 
$       # 

每頁:我要與此運行,看看我能得到它的建設總體匹配整個輸入時忽略換行/回車。

^((?:^|[^{]+)(?:\{(?:[^{]|$)|(?:\{{2}model\.variable(?:\|(?:(ein)|(phone)|(zipcode)|(currency:'':0)))?\}{2}|$)))+$demo

我只需要以除去單\r\n並移除多標誌。

+0

不錯的評論正則表達式!如果我打算使用在生產代碼中複雜的正則表達式,我可能會這樣評論它,因爲正則表達式在達到任何複雜性時都非常難以讀取/調試。 –

+0

謝謝@MichaelL。是的,事實是,我有時會深入**自己的**表達,並且不能從另一個角度講出一個')'。很高興'\ x'(freespacing)適合那些大個子。 –

+0

非常酷。我喜歡使用非捕獲組來從匹配結果中剔除無用的垃圾。我將運行這個,看看是否可以讓它在構建整個輸入的整體匹配時忽略換行符/回車(我道歉,這是我的錯誤 - 我說「段落輸入」當我的意思是「包含一個或多個段落的輸入「)。謝謝!另外,不用擔心空白文本 - 在我的應用程序中,只要任何Angular有效,用戶就可以輸入他們想要欺騙打印格式間距的任何錯誤。 – KieronAlsmith