寫個簡單的Java正規表示regex的產生器,目的是拿來Validate前端的輸入資料是否滿足條件。
使用Map
的原因是這樣的話在jsp頁面就可以用EL語法來取得了,例如value="${cstr['D_S_TW_EN']}"
。
protected static final CstrMap<Set<String>, String> cstr = new CstrMap<>();
String regex = cstr.get("D_S_TW_EN"); \\ "/^[\\d\\s\\u4e00-\\u9fa5a-zA-Z]*$/" (允許中英數空白)
...
enum Constraint {
D("\\d"),
EN("a-zA-Z"),
TW("\\u4e00-\\u9fa5"),
S("\\s"),
DSH("_"),
HYP("\\-"),
ASR("*"),
AT("@"),
EQ("="),
GT(">"),
LT("<"),
PRD("\\."),
EXC("!"),
QUE("?"),
CMA(",");
private String regex;
private Constraint (String regex){
this.regex = regex;
}
public String getRegex() {
return regex;
}
}
class CstrMap<K,V> extends HashMap<K,V> {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
@Override
public V get(Object key) {
return (V) getRegex((String) key);
}
private String getRegex(String cstr) {
List<String> list = new ArrayList<String>(new HashSet<>(Arrays.asList(cstr.split("_"))));
StringBuilder sb = new StringBuilder("/^[");
for(String s : list) {
for(Constraint c : Constraint.values()) {
if(s.equals(c.name())) {
sb.append(c.getRegex());
}
}
}
sb.append("]*$/");
return sb.toString();
}
}
其實原本這是我用在ZK zul頁面的UI元件如<textbox>
的constraint
屬性。
<textbox value="@bind(fx.name)" maxlength="30" constraint="@load(vm.cstr['D_TW_EN_S'])"/>
沒有留言:
張貼留言