2 Java Regexes验证Google DFP条目



我正在寻找2个输入字段的2条正则验证。

背景

i具有2个输入的表单(木兰CMS表格),该输入使用户可以输入 AD大小图像尺寸 for Google dfp。这是一种木兰CMS形式,其值在后端(Java)中得到验证。如果条目通过验证,则将显示在前端。此处的验证可防止用户输入错误的输入格式,这可能会导致JavaScript错误。

我在这里要实现的目标是通过2个正则验证验证这些输入。一个用于 AD尺寸输入字段,另一个用于图像大小输入字段。用户必须手动键入所有内容,包括方括号和其中的一些整数值(请参见下面的示例)。

在此问题中,条目意味着一个类似JSON的数组,由2个整数组成。例如。[1,10],[41,123],[0,0]等。

条目的格式和样本:

广告尺寸

如果用户只想仅输入1 entry (请参见示例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]]

这些条目应不通过 ad size Regex验证

  1. [212]
  2. [abcd]
  3. [1232,23111],[2312,323]
  4. [[2211,33],[22,321],[21]]
  5. 123,643

图像大小

对于图像尺寸,它应包含2个主要条目:第一个和第二个。这两个条目都通过逗号分隔

第一个条目应为2个整数数组。第二个条目可以是:

  • 另一个数组的2个整数(第一个示例)
  • 2个整数数组的数组(第二个示例)
  • 一个空数组(第三和第四个示例)

这些条目应通过图像大小正则验证:

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

这些条目应不通过图像大小正则验证:

  1. [123,421]
  2. [123,321,531],[321,33]
  3. 13,324,223,431
  4. [990],[728,90]
  5. [990,300],[Qwewqe,ggfggrg]

感谢您的帮助。

在木兰中有几种方法可以做到这一点。我将通过一个示例显示。

首先,我们需要一个组件和一个对话框:

# 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: ^[.*$

您会注意到我添加了两个字段验证器:" adsizids"one_answers" imgsizes"。这样做的第一种方法只是将大的正则义务作为"模式"属性,就像我在" iMgsizes"中所做的那样。那个特定的正则是任何东西...我在那里的那一条只是说我们希望线以'['角色开始。在您的特定示例中,您需要有条件的正则一条线来处理这一点。

的天真解决方案
^[([?d+,s?d+]?,?s?){1,}]$

在列表中的广告大小的测试#7失败。

我认为,如果我们不试图对他们太聪明,则更容易调试/维护。也就是说,不是试图一行做五件事,为什么不用五行做五件事呢?那是我第二种方式进来的地方。

您会在" Text1"字段上注意到我已连接的一个自定义验证器,称为sizefieldsvalidatodatordefinition。这是典型的木兰模式:

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;
    }
}

您可以看到,这是我首选的解决方案,实际上将问题分为几个步骤:首先,我们确保用户输入的内容以'['''和tim以'']''开始,然后确保我们确保其他东西是裸露的元组,或者是一组这样的元组。同样,有一些看起来更奇妙的写作方式的方法,还有更多简短的方法来编写它们。但是这种方式是可维护。而且,它通过您为广告尺寸进行的所有测试。

我将图像大小作为您的练习,因为它与广告尺寸非常相似。

我希望这会有所帮助。

最新更新