2 Java 个用于验证 google DFP 条目的正则表达式
2 Java Regexes to validate google DFP entry
我正在为 2 个输入字段寻找 2 个正则表达式验证。
背景
我有一个带有 2 个输入的表单(magnolia cms 表单),允许用户输入 广告尺寸 和 图片尺寸 Google 广告管理系统。这是一个 magnolia cms 表单,其值在后端进行验证 (Java)。
如果条目通过验证,它将显示在前端。此处的验证可防止用户输入错误的条目格式,这可能会导致 Java 脚本错误。
我在这里想要实现的是使用 2 个 Regex 验证来验证这些输入。一个用于 Ad Sizes 输入字段,另一个用于 Image Sizes 输入字段。
用户需要手动输入所有内容,包括方括号和其中的一些整数值(参见下面的示例)。
在这个问题中,一个条目意味着一个由 2 个整数组成的类似 json 的数组。
例如。 [1, 10], [41,123], [0,0], 等等..
条目的格式和示例:
广告尺寸
如果用户只想输入 1 entry(参见示例 1 和 2),则 1 个包含 2 个整数的数组就足够了。但是如果用户要输入超过 1 个 entry(示例 3 和 4),则用户必须将整个条目封装在 1 个方括号中。
这些条目应该通过广告尺寸正则表达式验证:
- [728, 90]
- [1,1]
- [[468, 60], [728, 90], [300, 250]]
- [[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 个整数数组的数组(第二个示例)
- 一个空数组(第 3 个和第 4 个示例)
这些条目应该通过图像尺寸正则表达式验证:
- [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]
- [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: ^\[.*$
您会注意到我添加了两个字段验证器:'adsizes' 和 'imgsizes'。做这样的事情的第一种方法只是使用一个大的正则表达式作为 RegexpValidatorDefinition 的 'pattern' 属性,就像我在 'imgsizes' 上所做的那样。那个特定的正则表达式可以是任何东西……我上面的那个只是说我们希望该行以“[”字符开头。在您的特定示例中,您需要一个条件正则表达式来在一行中处理这个问题。像
这样天真的解决方案
^\[(\[?\d+\,\s?\d+\]?\,?\s?){1,}\]$
您列表中的广告尺寸测试 #7 失败。
以我的观点和经验,如果我们不尝试对它们过于聪明,则正则表达式更容易调试/维护。也就是说,与其试图在一行中做五件事,不如在五行中做五件事?这就是我的第二种方式的用武之地。
您会注意到我在 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;
}
}
如您所见,我的首选解决方案实际上将问题分为几个步骤:首先,我们确保用户输入的内容以“[”开头并以“]”结尾,然后我们确保其他内容是裸元组或此类元组的集合。同样,有更好看的方式来编写这些正则表达式,并且有更简洁的方式来编写它们。但这种方式可维护。而且,它通过了您针对广告尺寸提出的所有测试。
我把图片尺寸留给你作为练习,因为它与广告尺寸非常相似。
希望对您有所帮助。
我正在为 2 个输入字段寻找 2 个正则表达式验证。
背景
我有一个带有 2 个输入的表单(magnolia cms 表单),允许用户输入 广告尺寸 和 图片尺寸 Google 广告管理系统。这是一个 magnolia cms 表单,其值在后端进行验证 (Java)。 如果条目通过验证,它将显示在前端。此处的验证可防止用户输入错误的条目格式,这可能会导致 Java 脚本错误。
我在这里想要实现的是使用 2 个 Regex 验证来验证这些输入。一个用于 Ad Sizes 输入字段,另一个用于 Image Sizes 输入字段。 用户需要手动输入所有内容,包括方括号和其中的一些整数值(参见下面的示例)。
在这个问题中,一个条目意味着一个由 2 个整数组成的类似 json 的数组。 例如。 [1, 10], [41,123], [0,0], 等等..
条目的格式和示例:
广告尺寸
如果用户只想输入 1 entry(参见示例 1 和 2),则 1 个包含 2 个整数的数组就足够了。但是如果用户要输入超过 1 个 entry(示例 3 和 4),则用户必须将整个条目封装在 1 个方括号中。
这些条目应该通过广告尺寸正则表达式验证:
- [728, 90]
- [1,1]
- [[468, 60], [728, 90], [300, 250]]
- [[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 个整数数组的数组(第二个示例)
- 一个空数组(第 3 个和第 4 个示例)
这些条目应该通过图像尺寸正则表达式验证:
- [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]
- [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: ^\[.*$
您会注意到我添加了两个字段验证器:'adsizes' 和 'imgsizes'。做这样的事情的第一种方法只是使用一个大的正则表达式作为 RegexpValidatorDefinition 的 'pattern' 属性,就像我在 'imgsizes' 上所做的那样。那个特定的正则表达式可以是任何东西……我上面的那个只是说我们希望该行以“[”字符开头。在您的特定示例中,您需要一个条件正则表达式来在一行中处理这个问题。像
这样天真的解决方案^\[(\[?\d+\,\s?\d+\]?\,?\s?){1,}\]$
您列表中的广告尺寸测试 #7 失败。
以我的观点和经验,如果我们不尝试对它们过于聪明,则正则表达式更容易调试/维护。也就是说,与其试图在一行中做五件事,不如在五行中做五件事?这就是我的第二种方式的用武之地。
您会注意到我在 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;
}
}
如您所见,我的首选解决方案实际上将问题分为几个步骤:首先,我们确保用户输入的内容以“[”开头并以“]”结尾,然后我们确保其他内容是裸元组或此类元组的集合。同样,有更好看的方式来编写这些正则表达式,并且有更简洁的方式来编写它们。但这种方式可维护。而且,它通过了您针对广告尺寸提出的所有测试。
我把图片尺寸留给你作为练习,因为它与广告尺寸非常相似。
希望对您有所帮助。