这是我在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找不到任何匹配的地方我做错了什么?它只在我移除外观时找到匹配项。谢谢。 (旁注,如果你可以“美化正则表达式,那也很酷;]”
答案 0 :(得分:1)
试试这个
\[\d+\/\d+\/\d+ \d+:\d+ - \w+\]
然后评论:
\[(\d+)\/(\d+)\/(\d+) (\d+):(\d+) - \w+\]([^\[]*)
您要求解释[^\[]*
:
[ ]
将为单个字符声明一个字符类,例如[0123456789]
; ^
否定它,即除了该类成员之外的任何单个字符; \[
需要转义左括号,因此需要文字[
*
是应用于前一个模式的量词 - 在这种情况下是否定的字符类。因此[^\[]*
表示除[
答案 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}*\\[|$)";