AdSense

網頁

2018/6/26

Java Regex 小工具

寫個簡單的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'])"/>

沒有留言:

AdSense