Java+;正则表达式:匹配自定义集合中不在同一集合中的字符前面的字符

Java+;正则表达式:匹配自定义集合中不在同一集合中的字符前面的字符,java,regex,Java,Regex,Java中的正则表达式遇到了一个愚蠢的问题,我想将以@开头的字符串与某个有效集的字符匹配,但前面不是同一个有效集的字符 我想匹配的条款如下: “y”++“xxxxxxx” 其中: x是属于有效集的字符[a-zA-Z\\d\\-\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ @符号出现一次 y是一个不属于有效集的字符 我目前正试图通过使用以下正则表达式模式来实现这一点 MY_PATTERN = "[^[A-Za-z

Java中的正则表达式遇到了一个愚蠢的问题,我想将以@开头的字符串与某个有效集的字符匹配,但前面不是同一个有效集的字符

我想匹配的条款如下:

“y”++“xxxxxxx”

其中:

  • 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