2017-02-21 57 views
0

我正在尋找2個輸入字段的2個正則表達式驗證。2 Java Regexes驗證谷歌DFP條目

背景

我有一個表格(玉蘭CMS形式)2個輸入,讓用戶輸入廣告尺寸圖像尺寸爲谷歌DFP。這是一個木蘭CMS形式,其值在後端(Java)中驗證。 如果條目通過驗證,它將顯示在前端。此處的驗證可防止用戶輸入可能導致Javascript錯誤的錯誤輸入格式。

我想在這裏實現的是驗證這些輸入與2正則表達式驗證。一個是廣告尺寸輸入字段,另一個是圖片大小輸入字段。 用戶需要手動輸入所有內容,包括方括號和其中的一些整數值(請參閱下面的示例)。

在這個問題中,一個條目意味着一個2個整數的類似json的數組。 例如[1,10],[41123],[0,0],等等。

爲條目的格式和樣品:

廣告尺寸

如果用戶想要輸入只有條目(參見示例1和2),則2個整數的1個數組就足夠了。但是如果用戶想要輸入多於1個條目(示例3和4),則用戶必須將整個條目封裝在1個方括號中。

這些條目應該廣告尺寸正則表達式驗證:

  1. [728,90]
  2. [1,1]
  3. [[468,60],[728,90], [300,250]]
  4. [[468,60],[728,90],[300,250],[1,1]]

這些條目應該不能通過廣告尺寸正則表達式驗證

  • [212]
  • [ABCD]
  • [1232,23111],[2312,323]
  • [[2211,33] [22321],[21]]
  • 圖像尺寸

    對於圖像大小,它應該包含2個主要條目:第一個和第二個。兩個條目以逗號分隔。

    第一項應該是2整數數組。 第2項可以是:

    • 的2個整數(第一實施例)另一個陣列
    • 陣列2的整數陣列(第二實施例)
    • 空數組(第三和第四實施例)的

    這些條目應該圖像尺寸的正則表達式驗證:

    1. [990,300],[728,90]
    2. [990,300],[[728,90],[320,200],[80,31],[]]
    3. [990,300], []
    4. [1,1],[]

    這些條目應該不能通過圖像尺寸的正則表達式驗證:

  • [123,421]
  • [123,321,531],[321,33]
  • [990],[728,90]
  • [990300],[qwewqe,ggfggrg]
  • 感謝您的幫助。

    +0

    我不明白這裏要問什麼,你問我們的正則表達式來實現這個嗎? – zack6849

    +0

    是的zack6849,我正在尋找正則表達式驗證。我編輯了這個問題,所以它更清晰 – sirhc

    回答

    1

    在Magnolia有幾種方法可以做到這一點。我將通過一個例子展示兩者。

    首先,我們需要一個組件和一個對話框:

    # component 
    dialog: valid:texttext 
    description: some yummy text you should enter 
    renderType: freemarker 
    title: Texttext 
    templateScript: /valid/templates/components/texttext.ftl 
    
    # dialog  
    actions: 
        commit: 
        label: save changes 
        class: info.magnolia.ui.admincentral.dialog.action.SaveDialogActionDefinition 
        cancel: 
        label: cancel 
        class: info.magnolia.ui.admincentral.dialog.action.CancelDialogActionDefinition 
    form: 
        tabs: 
        - name: tabMain 
         label: Texttext Dialog 
         fields: 
         - name: text1 
          label: text1 
          description: enter some text 1 
          class: info.magnolia.ui.form.field.definition.TextFieldDefinition 
          validators: 
          adsizes: 
           class: info.magnolia.test.field.validator.SizeFieldsValidatorDefinition 
           errorMessage: Invalid ad size entered 
         - name: text2 
          label: text2 
          description: enter some text 2 
          class: info.magnolia.ui.form.field.definition.TextFieldDefinition 
          validators: 
          imgsizes: 
           class: info.magnolia.ui.form.validator.definition.RegexpValidatorDefinition 
           errorMessage: invalid image size entered 
           pattern: ^\[.*$ 
    

    你會注意到我添加了兩個字段驗證:「adsizes」和「imgsizes」。做這樣的事情的第一種方式就是用一個大的正則表達式作爲RegexpValidatorDefinition的'模式'屬性,就像我在'imgsizes'上做的那樣。這個特定的正則表達式可以是任何東西......我在那裏只是說我們希望該行以'['字符開頭。在你的特定例子中,你需要一個條件正則表達式來處理這一行。一種天真的解決方案,如

    ^\[(\[?\d+\,\s?\d+\]?\,?\s?){1,}\]$ 
    

    未通過廣告尺寸的測試#7,在您的列表中。

    在我的觀點和經驗中,如果我們不試圖對他們太過聰明,regexen更容易調試/維護。也就是說,不是試圖在一行中做五件事,爲什麼不在五行中做五件事?這是我的第二種方式進來的地方。

    你會注意到text1字段我已經附加了一個名爲SizeFieldsValidatorDefinition的自定義驗證器。這是典型的玉蘭模式:

    package info.magnolia.test.field.validator; 
    
    import info.magnolia.ui.form.validator.definition.ConfiguredFieldValidatorDefinition; 
    
    public class SizeFieldsValidatorDefinition extends ConfiguredFieldValidatorDefinition { 
        public SizeFieldsValidatorDefinition() { 
         setFactoryClass(SizeFieldsValidatorFactory.class); 
        } 
    } 
    
    
    package info.magnolia.test.field.validator; 
    
    import info.magnolia.context.Context; 
    import info.magnolia.ui.form.validator.factory.AbstractFieldValidatorFactory; 
    
    import com.vaadin.data.Item; 
    import com.vaadin.data.Validator; 
    
    public class SizeFieldsValidatorFactory extends AbstractFieldValidatorFactory<SizeFieldsValidatorDefinition> { 
        private final Item item; 
        private final Context context; 
    
        public SizeFieldsValidatorFactory(final SizeFieldsValidatorDefinition definition, final Item item, final Context context) { 
         super(definition); 
    
         this.item = item; 
         this.context = context; 
        } 
    
        public Validator createValidator() { 
         return new SizeFieldsValidator(item, context, getI18nErrorMessage()); 
        } 
    } 
    
    
    package info.magnolia.test.field.validator; 
    
    import info.magnolia.context.Context; 
    
    import java.util.regex.Matcher; 
    import java.util.regex.Pattern; 
    
    import org.apache.commons.lang3.StringUtils; 
    
    import com.vaadin.data.Item; 
    import com.vaadin.data.validator.AbstractStringValidator; 
    
    public class SizeFieldsValidator extends AbstractStringValidator { 
    
        private final Item item; 
        private final Context context; 
    
        public SizeFieldsValidator(final Item item, final Context context, final String errorMessage) { 
         super(errorMessage); 
    
         this.item = item; 
         this.context = context; 
        } 
    
        @Override 
        protected boolean isValidValue(String text1) { 
         if (!StringUtils.isEmpty(text1)) { 
          return checkit(text1); 
         } 
    
         return false; 
        } 
    
        private boolean checkit(String text1) { 
         // the atomic pattern '[number,number]': 
         Pattern atom = Pattern.compile("\\[\\d+\\s?\\,\\s?\\d+\\]"); 
    
         // must start with '[' and end with ']' in all cases: 
         Pattern pattern = Pattern.compile("^\\[(.*)\\]$"); 
         Matcher matcher = pattern.matcher(text1); 
         if (!matcher.matches()) { 
          return false; 
         } 
    
         // the bit inside the required outer '[' and ']': 
         String data = matcher.group(1); 
    
         // now check that the bits inside follow the plan: 
         if (!Pattern.matches("\\d+\\s?\\,\\s?\\d+", data) && !Pattern.matches("(" + atom + "\\s?\\,?\\s?){1,}", data)) { 
          //^bare numbers        //^multiple objs 
          return false; 
         } 
    
         return true; 
        } 
    } 
    

    正如你所看到的,這一點,我的首選解決方案,實際上是打破了問題分成幾個步驟:首先,我們要確保是什麼輸入的用戶開始用「[」和以']'結尾,然後我們確定其他東西是一個空的元組,或者是這些元組的集合。再次,寫這些正則表達式有更好看的方法,並且有更多簡潔的方法來寫它們。但這種方式是可維護。並且,它會通過您爲廣告尺寸提出的所有測試。

    我已經將圖片尺寸作爲練習留給了您,因爲它與廣告尺寸非常相似。

    我希望這會有所幫助。

    +0

    現在很棒!我曾想過打破正則表達式,但沒有想到這種方法。謝謝布拉德利! – sirhc