Java Regex匹配直到字符

时间:2015-04-27 18:35:10

标签: java regex

这是我在java中的(丑陋)正则表达式:

\\[(\\d{2}?)/(\\d{2}?)/(\\d{2}?) (\\d{2}?):(\\d{2}?) - \\w+?\\] (.+?)(?=\\[)

理想情况下,它分为6组MM,DD,YY等。:

 [MM/DD/YY HH:mm - userName] commentUntilNextBracket

这适用于我的java程序,除了(?=\\[),正则表达式的最后一部分

Pattern p = Pattern.compile(REGEX_STRING);
Matcher m = p.matcher(comment));
while(m.find()){ //do something}

取消前瞻将使我能够获得' c' in" commentUntilNextBracket"但我想要整个字符串。我使用Regex Planet

测试了这个

它实际上适用于整个正则表达式。这是我在我的程序和Regex Planet中尝试的示例输入。它适用于后者。它找到了所有4场比赛和0-6组。

  

[04/24/15 11:16 - username] office [04/25/15 13:25 - username] what [04/27/15 07:45 - username] officeNote [04/27/15 08: 59 - 用户名]检查[04/27/15 09:01 - 用户名]双重检查

那么在我的Java8找不到任何匹配的地方我做错了什么?它只在我移除外观时找到匹配项。谢谢。 (旁注,如果你可以“美化正则表达式,那也很酷;]”

2 个答案:

答案 0 :(得分:1)

试试这个

\[\d+\/\d+\/\d+ \d+:\d+ - \w+\]

Demo

然后评论:

\[(\d+)\/(\d+)\/(\d+) (\d+):(\d+) - \w+\]([^\[]*)

Demo

Regex Planet

您要求解释[^\[]*

  1. 外部[ ]将为单个字符声明一个字符类,例如[0123456789];
  2. 字符类中的^否定它,即除了该类成员之外的任何单个字符;
  3. \[需要转义左括号,因此需要文字[
  4. *是应用于前一个模式的量词 - 在这种情况下是否定的字符类。
  5. 因此[^\[]*表示除[

    之外的零个或多个字符

答案 1 :(得分:0)

我会使用一个使用延迟匹配的正则表达式和一个包含[和结束字符串/行$测试的预测:

\\[(\\d{2}?)/(\\d{2}?)/(\\d{2}?)\\s+(\\d{2}?):(\\d{2}?)\\s+-\\s+\\w+?\\]\\s+(.+?)(?=\\s*\\[|$)

这将符合您的所有情况。

在RegexPlanet上

Demo,或只是Regex101上的展示,看看正则表达式的作用。

我还建议使用\s而不是文字空格,因为它会匹配任何空格并且更容易维护(尤其是在使用详细选项ON进行测试时)。要匹配硬空间,您可以将\s替换为\p{Zs}。实际上,我们可以完全使用Unicode - "兼容":

REGEX: \[(\p{N}{2}?)/(\p{N}{2}?)/(\p{N}{2}?)\p{Zs}+(\p{N}{2}?):(\p{N}{2}?)\p{Zs}+-\p{Zs}+[\p{L}\p{N}_]+?\]\p{Zs}+(.+?)(?=\p{Zs}*\[|$)

JAVA: String ptrn = "\\[(\\p{N}{2}?)/(\\p{N}{2}?)/(\\p{N}{2}?)\\p{Zs}+(\\p{N}{2}?):(\\p{N}{2}?)\\p{Zs}+-\\p{Zs}+[\\p{L}\\p{N}_]+?\\]\\p{Zs}+(.+?)(?=\\p{Zs}*\\[|$)";