Java+;正则表达式:匹配自定义集合中不在同一集合中的字符前面的字符
Java中的正则表达式遇到了一个愚蠢的问题,我想将以@开头的字符串与某个有效集的字符匹配,但前面不是同一个有效集的字符 我想匹配的条款如下: “y”++“xxxxxxx” 其中:Java+;正则表达式:匹配自定义集合中不在同一集合中的字符前面的字符,java,regex,Java,Regex,Java中的正则表达式遇到了一个愚蠢的问题,我想将以@开头的字符串与某个有效集的字符匹配,但前面不是同一个有效集的字符 我想匹配的条款如下: “y”++“xxxxxxx” 其中: x是属于有效集的字符[a-zA-Z\\d\\-\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ @符号出现一次 y是一个不属于有效集的字符 我目前正试图通过使用以下正则表达式模式来实现这一点 MY_PATTERN = "[^[A-Za-z
- x是属于有效集的字符
[a-zA-Z\\d\\-\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- @符号出现一次
- y是一个不属于有效集的字符
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\uuu-
while(m.find()){
字符串s=m.group();
系统输出打印项次;
}
但是,它也会打印出a@cat123-_
有人能解释一下我做错了什么吗?您的模式中有一些问题,这里有一个应该解决的问题:
(?:^|[^A-Za-z\d\-\_])(@[A-Za-z\d\-\_]+)
@{1}
它与@
[^[A-Za-z\d\-\\\\\\\\?]
问题似乎就在这里,您使用的是嵌套字符集,这不起作用[^A-Za-z\d \-\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
(?:^[^\w\-])(@[\w\-]+)
\w
匹配任何字母数字字符和下划线
测试这一点:
它是javascript,但不应该有任何问题。我假设您尝试匹配的文本可能在任何地方,而不是锚定到字符串的开头 您用于
[^[A-Za-z\\d\\-\\\\\\\\\\\?]
的语法是错误的,并且被解释为其他内容(我们不必深入讨论)。求反字符类是[^chars]
。因此,语法应该是[^A-Za-z\\d\\-\\\\\\\\\\\-
。但是,这需要匹配“@”
”之前的字符,因此它不会匹配“@foo”
,因为“前面没有字符(不是a-Za-z0-9-)”
去营救。负查找(?指定当前位置前面没有子模式
哦,还有一件事,[A-Za-z\\d\\-\\-\\\\-\\\\\-\\\\\\\\\\\\-\/code>与[-\\w]
相同(让我们使用较短的版本)
因此正则表达式应该是:
(?
您的正则表达式可以大大简化,因为:
[a-zA-Z\\d\\-\\_] === [\w-]
这就是你想要的:
[^\w-]@[\w-]
如果你的意思是“不在集合中”,我想应该是[^A-Za-z\\d\\-\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\“999”@MarcosCasagrande说regex需要在@
前面加一个字符。是的,我知道,我刚刚修改了OP的语法,使它能与他的regex一起工作。无论如何,在javascript中你不能使用lookbehinds(我知道这是一个java问题)所以我无法测试它。你的答案应该是可以接受的。无论如何,这就是我添加捕获组的原因。只是指出了一个可能不想要的结果。在JavaScript中,这可以通过以下方式解决:/(?:^ |[^-\w])(@[-\w]+)/g