[英]Java Regex Matching Until Character
這是我在Java中的(難看的)正則表達式:
\\[(\\d{2}?)/(\\d{2}?)/(\\d{2}?) (\\d{2}?):(\\d{2}?) - \\w+?\\] (.+?)(?=\\[)
理想情況下,它分為MM,DD,YY等6個組:
[MM/DD/YY HH:mm - userName] commentUntilNextBracket
這在我的Java程序中有效,除了(?=\\\\[)
,正則表達式的最后一部分
Pattern p = Pattern.compile(REGEX_STRING);
Matcher m = p.matcher(comment));
while(m.find()){ //do something}
刪除前瞻將使我在“ commentUntilNextBracket”中獲得“ c”,但我需要整個字符串。 我使用以下方法測試了此: Regex Planet
它實際上適用於整個正則表達式。 這是我在程序和Regex Planet中都嘗試過的示例輸入。 它適用於后者。 找到了所有4場比賽和0-6組。
[04/24/15 11:16-用戶名]辦公室[04/25/15 13:25-用戶名]什么[04/27/15 07:45-用戶名] officeNote [04/27/15 08:59-用戶名]檢查[04/27/15 09:01-用戶名]仔細檢查
那么,在Java8找不到任何匹配項的情況下,我該怎么做呢? 當我刪除環顧四周時,它只會找到匹配項。 謝謝。 (注意,如果您可以“美化”正則表達式,那也很酷;])
嘗試這個
\[\d+\/\d+\/\d+ \d+:\d+ - \w+\]
然后的評論:
\[(\d+)\/(\d+)\/(\d+) (\d+):(\d+) - \w+\]([^\[]*)
您要求對[^\\[]*
進行解釋:
[ ]
用於聲明單個字符的字符類,例如[0123456789]
。 ^
取反,即除該類成員之外的任何單個字符; \\[
需要轉義左括號,因此文字[
*
是應用於先前模式的量詞-在這種情況下為否定字符類。 因此,此[^\\[]*
表示零個或多個字符,除了[
我將使用正則表達式,該規則表達式使用惰性匹配和包括[
和字符串結尾/行$
測試的前瞻:
\\[(\\d{2}?)/(\\d{2}?)/(\\d{2}?)\\s+(\\d{2}?):(\\d{2}?)\\s+-\\s+\\w+?\\]\\s+(.+?)(?=\\s*\\[|$)
這將匹配您遇到的所有情況。
在RegexPlanet上進行演示 ,或者僅在Regex101上進行展示,以查看regex的功能。
我還建議使用\\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}*\\[|$)";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.