我在 Java 正则表达式中遇到了一个愚蠢的问题,我想将以 @ 开头的字符串与某个有效集合中的字符相匹配,但前面没有来自同一有效集合中的字符。
我要匹配的术语是以下形式:
“y”+@+“xxxxxxx”
哪里:
- x 是属于有效集
[a-zA-Z\\d\\-\\_]
的字符
- @符号出现一次
- y 是一个不属于有效集合
[a-zA-Z\\d\\-\\_]
的字符
我目前正在尝试通过使用以下正则表达式模式来做到这一点
MY_PATTERN = "[^[A-Za-z\\d\\-\\_]?]" + "@{1}" + "[A-Za-z\\d\\-\\_]+"
String text = "12a@cat123-_ @dog123__- ";
Pattern p = Pattern.compile(PATTERN);
Matcher m = p.matcher(text);
基于此,我希望以下代码仅打印 @dog123__-
while(m.find()){
String s = m.group();
System.out.println(s);
}
但是它也打印出 a@cat123-_
。
谁能解释一下我做错了什么?
最佳答案
我假设您要匹配的文本可以在任何地方,而不是锚定到字符串的开头。
您用于 [^[A-Za-z\\d\\-\\_]?]
的语法是错误的并且被解释为其他东西(让我们不要进入那个)。否定字符类是 [^chars]
.所以语法应该是 [^A-Za-z\\d\\-_]
.但是,要求 匹配 "@"
之前的那个字符, 所以它不会匹配 "@foo"
,因为“之前没有字符(不是 A-Za-z0-9-_)”。
Lookbehinds救援。负面回顾(?<!subpattern)
指定当前位置前面没有子模式。
哦,还有一件事,[A-Za-z\\d\\-_]
与[-\\w]
相同(让我们使用那个较短的版本)。
所以正则表达式应该是:
(?<![-\\w])@[-\\w]+
关于Java + 正则表达式 : matching characters from a customized set that are not preceded by characters in the same set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32878239/