Java + 正则表达式 : matching characters from a customized set that are not preceded by characters in the same set

标签 java regex

我在 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]+

ideone Demo

关于Java + 正则表达式 : matching characters from a customized set that are not preceded by characters in the same set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32878239/

相关文章:

java - 房间数据库 - 编辑实体

mysql - 搜索查询的正则表达式,如 : word1 * (word2 -word3 -word4) * word5

ruby - 匹配 ruby 中的大括号,前面有一个字符

c# - C++/C#/Java视频分析题

java - 关机还是不关机?在 ExecutorService (Java8) 中

java - 正则表达式允许除无效字符之外的所有字符

Javascript Regex 对象和美元符号

javascript - 正则表达式排除最后匹配的字符

java - 匹配部分字符串以恢复密码

java - 如何在 BroadLeaf Commerce 框架中找到请求的 Controller 类