我的要求如下所示
输入字符串中允许使用以下特殊字符:
. ""(),:;<>@[\]
特殊字符的限制是它们只能在包含在引号之间时使用。
对于输入字符串中的“:”的简单测试,我编写了如下代码:
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);
}
}
答案 0 :(得分:3)
你想要积极的前瞻和积极的外观。
(.*(?<=")[.\x20(),:;<>@\[\]"](?=").*)+
<强>描述强>
示例代码
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部分的完整演示和说明。