簡體   English   中英

Java正則表達式匹配直到字符

[英]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+\]([^\[]*)

演示

或在Regex Planet中


您要求對[^\\[]*進行解釋:

  1. 外部的[ ]用於聲明單個字符的字符類,例如[0123456789]
  2. 字符類中的^取反,即除該類成員之外的任何單個字符;
  3. \\[需要轉義左括號,因此文字[
  4. *是應用於先前模式的量詞-在這種情況下為否定字符類。

因此,此[^\\[]*表示零個或多個字符,除了[

我將使用正則表達式,該規則表達式使用惰性匹配和包括[和字符串結尾/行$測試的前瞻:

\\[(\\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM