使用Regex在特殊字符之间获取文本

时间:2014-08-16 08:58:55

标签: java regex string-matching

我正试图在特殊字符“|”之间获取单词其格式为[a-z]+@[0-9]+

示例文字 -

||ABC@123|abc@123456||||||ABcD@12||

预期产出 -

ABC@123, abc@123456, ABcD@12

正则表达式我正在使用

(?i)\\|[a-z]+@[0-9]+\\|

当我使用这个正则表达式时,我得到的输出是|ABC@123|

我在做什么错?有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:2)

您需要使用匹配但不包含该匹配项的Lookaround

(?<=\||^)[a-z]+@[0-9]+(?=\||$)

这是regex101 online demo

示例代码:

String pattern = "(?i)(?<=\\||^)[a-z]+@[0-9]+(?=\\||$)";
String str = "|ABC@123|abc@123456|ABcD@12";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(str);
while (m.find()) {
    System.out.println(m.group());
}

输出:

ABC@123
abc@123456
ABcD@12

Lookaheadlookbehind,统称为lookaround,是零长度断言。区别在于环视实际匹配字符,但随后放弃匹配,仅返回结果:匹配或不匹配。这就是他们被称为“断言”的原因。

Read more...

模式说明:

  (?<=                     look behind to see if there is:
    \|                       '|'
   |                        OR
    ^                        the beginning of the line
  )                        end of look-behind

  [a-z]+                   any character of: 'a' to 'z' (1 or more times)
  @                        '@'
  [0-9]+                   any character of: '0' to '9' (1 or more times)

  (?=                      look ahead to see if there is:
    \|                       '|'
   |                        OR
    $                         the end of the line
  )                        end of look-ahead

答案 1 :(得分:0)

您不应该将|放在您的模式中,否则它将匹配。像在另一个解决方案中一样使用lookaraound运算符,或者只匹配(demo):

[a-z]+@\d+

您还应考虑将|上的字符串拆分为here