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

Java 字符串中允许的字符的正则表达式返回false,java,regex,Java,Regex,我的要求如下 输入字符串中允许以下特殊字符,但有限制: . ""(),:;<>@[\] 但此代码返回false而不是true 编辑:在阅读注释后,我将代码修改为这个,但它仍然显示为false 我修改了我的代码,如下所示: public class TestFeatures { private Pattern pattern; private Matcher matcher; private static final String PATTERN = "[.

我的要求如下

输入字符串中允许以下特殊字符,但有限制:

. ""(),:;<>@[\]
但此代码返回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);
    }
}

你需要积极的向前看和积极的向后看

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

你需要积极的向前看和积极的向后看

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

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

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

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


您可以找到regex部分的完整演示和解释。

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

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

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


你可以找到正则表达式各部分的完整演示和解释。

用括号代替括号,不要使用
匹配()
(或在正则表达式的开头和结尾添加
*
)。我的作业感觉很刺痛
matches
:“[t]判断这个字符串是否匹配给定的正则表达式”。用括号替换括号,不要使用
matches()
(或在正则表达式的开头和结尾添加
*
)。我的作业感觉很刺痛
匹配
:“[t]说明此字符串是否匹配给定的正则表达式”。感谢您的评论。我修改了我的代码,并在原始帖子中进行了更改。谢谢你的评论。我修改了我的代码并在原始帖子中进行了更改谢谢你的解释谢谢你的解释
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