gpt4 book ai didi

java - 2 个 Java 正则表达式来验证 google DFP 条目

转载 作者:行者123 更新时间:2023-12-01 08:51:29 27 4
gpt4 key购买 nike

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

背景

我有一个带有 2 个输入的表单(magnolia cms 表单),可让用户输入 Google DFP 广告管理系统的广告尺寸图像尺寸。这是一个 Magnolia cms 表单,其值在后端 (Java) 中进行验证。如果条目通过验证,它将显示在前端。这里的验证可以防止用户输入错误的输入格式,从而导致 Javascript 错误。

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

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

参赛作品的格式和示例:

广告尺寸

如果用户只想输入 1 个条目(参见示例 1 和 2),则 1 个包含 2 个整数的数组就足够了。但如果用户想要输入超过 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],[22,321],[21]]
  • 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], []

    这些条目应该不能通过图像大小正则表达式验证:

  • [123, 421]
  • [123, 321, 531], [321, 33]
  • 13,324,223,431
  • [990], [728, 90]
  • [990,300],[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: ^\[.*$

    您会注意到我添加了两个字段 validator :“adsizes”和“imgsizes”。做这样的事情的第一种方法就是使用一个大的正则表达式作为 RegexpValidatorDefinition 的“模式”属性,就像我在“imgsizes”上所做的那样。这个特定的正则表达式可以是任何东西......我上面的正则表达式只是说我们希望该行以“[”字符开头。在您的特定示例中,您需要一个条件正则表达式来在一行中处理此问题。像

    这样的简单解决方案
    ^\[(\[?\d+\,\s?\d+\]?\,?\s?){1,}\]$

    在列表中的广告尺寸测试#7 中未通过。

    根据我的观点和经验,如果我们不尝试太聪明地使用正则表达式,它们会更容易调试/维护。也就是说,与其试图在一行中做五件事,为什么不在五行中做五件事呢?这就是我的第二种方法的用武之地。

    您会注意到,我在 text1 字段上附加了一个名为 SizeFieldsValidatorDefinition 的自定义 validator 。这是典型的木兰图案:

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

    正如您所看到的,这是我首选的解决方案,实际上将问题分解为几个步骤:首先,我们确保用户输入的内容以“[”开头并以“]”结尾,然后我们确保其他的东西是一个裸元组,或者是这样的元组的集合。同样,有更美观的方式来编写这些正则表达式,并且有更简洁的方式来编写它们。但这种方式是可维护的。而且,它通过了您对广告尺寸提出的所有测试。

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

    我希望这会有所帮助。

    关于java - 2 个 Java 正则表达式来验证 google DFP 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42372009/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com