4

我在使用 string.matches(regex) 时遇到了 url 验证器的问题。以下在 Java 6 中工作,但在 Java 7 中不工作。

regex = "^http[s]?://(([^/:\\.[:space:]]+(\\.[^/:\\.[:space:]]+)*)|([0-9](\\.[0-9]{3})))(:[0-9]+)?((/[^?#[:space:]]+)(\\?[^#[:space:]]+)?(\\#.+)?)?$"

此代码位于客户端,使用 GWT/GXT 在将用户输入发送到服务器端之前对其进行验证。

至少可以说令人费解。

这是方法:

public boolean validateURL(String url) {
    return ((url != null) && url.matches(VALID_URL_REGEX));
}   

其中 VALID_URL_REGEX 等于上面的正则表达式

下面是调用 validateURL 方法的代码:

    this.serverUrlTextField.addValidator(new AbstractValidator<String>() {
        @Override
        public List<EditorError> validate(Editor<String> field, String value) {
            String url = serverUrlTextField.getText();
            if (!Util.validateURL(url)) {
                okButton.setEnabled(false);
                return createError(new DefaultEditorError(field, INVALID_URL, value));
            }
            okButton.setEnabled(true);
            return null;
        }
    });
4

1 回答 1

0

看起来 GXT 有一个com.google.gwt.regexp.shared.RegExp与 JavaScript 更兼容的特殊类。我还以应该在 JavaScript 中工作的方式修改了正则表达式。

String p = "^(http[s]?://)?(([^/:\\.\\s]+(\.[^/:\\.\\s]+)*)|([0-9](\\.[0-9]{3})))(:[0-9]+)?((/[^?#\\s]+)(\\?[^#\\s]+)?(\\#.+)?)?$";
RegExp r = RegExp.compile(p, "i");
String url = serverUrlTextField.getText();
if (!r.test(url)) {
    okButton.setEnabled(false);
    return createError(new DefaultEditorError(field, INVALID_URL, value));
}
okButton.setEnabled(true);
return null;
于 2013-03-30T21:24:41.773 回答