字符串中允许的字符的正则表达式返回false

时间:2014-01-09 13:08:16

标签: java regex

我的要求如下所示

  

输入字符串中允许使用以下特殊字符:

. ""(),:;<>@[\]
     

特殊字符的限制是它们只能在包含在引号之间时使用。

对于输入字符串中的“:”的简单测试,我编写了如下代码:

private static void testEmailPattern() {
    String email = "Test\":\"mail";
    String PATTERN = "[\":\"]*";
    boolean isValidEmail = email.matches(PATTERN);
    System.out.println("Status: " + isValidEmail);
}

但此代码返回false而不是true。

编辑:阅读评论后,我将该代码修改为此,但它仍显示为false。

我修改了我的代码并按如下方式进行了修改:

public class TestFeatures {
    private Pattern pattern;
    private Matcher matcher;

    private static final String PATTERN = "[.*\":\".*]*";

    public TestFeatures() {
        initEmailPattern();
    }

    private void initEmailPattern() {
        pattern = Pattern.compile(PATTERN);     
    }

    public boolean validate(final String hex) {
        matcher = pattern.matcher(hex);
        return matcher.matches();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        testEmailPattern();
    }

    private static void testEmailPattern() {
        String email = "Test\":\"mail@mail.com";
        TestFeatures thisClazz = new TestFeatures();
        boolean isValidEmail = thisClazz.validate(email);
        System.out.println("Status: " + isValidEmail);
    }
}

2 个答案:

答案 0 :(得分:3)

你想要积极的前瞻和积极的外观。

(.*(?<=")[.\x20(),:;<>@\[\]"](?=").*)+

<强>描述

Regular expression visualization

示例代码

String[] tests = {
       "Test:mail",
       "Test\":\"mail",
       "Test\"ll",
       ".\".",
       "foo\"\"\""
};

String re = "(.*(?<=\")[.\\x20(),:;<>@\\[\\]\"](?=\").*)+";

int len=tests.length;
for(int i=0; i<len;i++) {
    System.out.format("Test %d: %s >> %s\n" , i+1, tests[i], tests[i].matches(re));
}

<强>输出

Test 1: Test:mail >> false
Test 2: Test":"mail >> true
Test 3: Test"ll >> false
Test 4: .". >> false
Test 5: foo""" >> true

答案 1 :(得分:1)

[...]是一个字符类。字符类匹配单个字符,大多数字符的含义在包含在字符类中时会发生变化。当您拥有[.*\":\".*]时,其匹配任何字符.*\":\".*。 (最后三个字符是多余的。)*重复前一项零次或多次。 As Alex said.matches()只有在正则表达式匹配整个字符串时才会返回true。使用正则表达式时,[.*\":\".*]*.matches()仅对看起来像这样的字符串返回true::.\"*.*..\":**\":::.\"*.

我认为你想要的正则表达式是:

[^. (),:;@\"\\[\\]\\\\*"]*(?:".*")?[^. (),:;@\"\\[\\]\\\\]*

在任何引号之前,除了指定的特殊字符(以下称为“SScs”)之外,允许使用任何字符。这是由正则表达式的第一部分实现的:[^. (),:;@\"\\[\\]\\\\*"]*。它匹配任意大小的字符序列,不包括SSC。在 all 字符串中的引号之后,除了SScs之外,允许使用任何字符。这就是正则表达式末尾[^. (),:;@\"\\[\\]\\\\]*的含义。它将匹配字符串末尾的任何字符序列,只要它不包含SSC即可。在正则表达式的中间,有(?:".*")?。因为引号内允许任何字符,所以这将匹配引号后跟任何字符序列,后跟另一个引号。但是,因为字符串可能不包含任何引号,所以它通过问号变为可选。

您可以找到正则表达式here部分的完整演示和说明。