2个Java正则表达式,用于验证google DFP条目

2个Java正则表达式,用于验证google DFP条目,java,vaadin,magnolia,Java,Vaadin,Magnolia,我正在为2个输入字段寻找2个正则表达式验证 背景 我有一个表单magnolia cms表单,有2个输入,允许用户输入谷歌DFP的广告大小和图像大小。这是一个magnolia cms表单,其值将在后端Java中验证。 如果条目通过验证,它将显示在前端。此处的验证可防止用户输入可能导致Javascript错误的错误输入格式 我在这里试图实现的是用2个正则表达式验证来验证这些输入。一个用于广告尺寸输入字段,另一个用于图像尺寸输入字段。 用户需要手动键入所有内容,包括方括号和其中的一些整数值。请参见下面

我正在为2个输入字段寻找2个正则表达式验证

背景

我有一个表单magnolia cms表单,有2个输入,允许用户输入谷歌DFP的广告大小和图像大小。这是一个magnolia cms表单,其值将在后端Java中验证。 如果条目通过验证,它将显示在前端。此处的验证可防止用户输入可能导致Javascript错误的错误输入格式

我在这里试图实现的是用2个正则表达式验证来验证这些输入。一个用于广告尺寸输入字段,另一个用于图像尺寸输入字段。 用户需要手动键入所有内容,包括方括号和其中的一些整数值。请参见下面的示例

在这个问题中,一个条目意味着一个由2个整数组成的类似json的数组。 例如[1,10]、[41123]、[0,0]等

条目的格式和示例:

广告尺寸

如果用户只想输入1个条目(参见示例1和2),那么1个2整数数组就足够了。但是如果用户想要输入多个条目,例如3和4,那么用户必须将整个条目封装在1个方括号中

这些条目应通过Ad sizes regex验证:

[728, 90] [1,1] [[468, 60], [728, 90], [300, 250]] [[468, 60], [728, 90], [300, 250], [1, 1]] 这些条目不应通过Ad sizes regex验证

[212] [abcd] [1232,23111],[2312,323] [[2211,33],[22,321],[21]] 123,643 图像大小

对于图像大小,它应该包含两个主要条目:第一个和第二个。两个条目都用逗号分隔

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

另一个由2个整数组成的数组第一个示例 2整数数组第2个示例 第三个和第四个示例中的空数组 这些条目应通过图像大小正则表达式验证:

[990, 300], [728, 90] [990, 300], [[728, 90], [320, 200], [80, 31], []] [990,300],[] [1, 1], [] 这些条目不应通过图像大小正则表达式验证:

[123, 421] [123, 321, 531], [321, 33] 13,324,223,431 [990], [728, 90] [990300],[qwewqe,ggfggrg]
谢谢你的帮助。

在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”。第一种方法是使用一个大的regex作为RegexpValidatorDefinition的“pattern”属性,就像我在“imgsizes”中所做的那样。那个特殊的正则表达式可以是任何东西。。。我上面的一个只是说,我们希望行以“[”字符开头。在您的特定示例中,您需要一个条件正则表达式在一行中处理这个问题。一个简单的解决方案,如

^\[(\[?\d+\,\s?\d+\]?\,?\s?){1,}\]$
未通过列表中广告大小的测试7

在我看来,根据我的经验,如果我们不想对regexen太聪明的话,它更容易调试/维护。也就是说,与其在一行中做五件事,为什么不在五行中做五件事呢?这就是我的第二种方法

您会注意到我在text1字段中附加了一个名为SizeFeldsValidatorDefinition的自定义验证器。这是典型的Magnolia模式:

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;
    }
}
如您所见,这是我首选的解决方案,它实际上将问题分解为两个步骤:首先,我们确保用户输入的内容以“[”开头,以“],然后我们确保其他东西是一个空的元组,或者是这样的元组的集合。同样,有更好的方法来编写这些正则表达式,也有更简洁的方法来编写它们。但是这种方法是可维护的。而且,它通过了你提出的所有关于广告大小的测试

我把图像大小留给你们作为练习,因为它与广告大小非常相似


我希望这能有所帮助。

我不明白这里问的是什么,你是在要求我们使用正则表达式来实现这一点吗?是的,zack6849,我正在寻找正则表达式验证。我编辑了这个问题,所以它很清楚。现在这太棒了!我曾想过分解正则表达式,但没有想到这种方法。谢谢布拉德利!