[英]Regex parser step by step Java
這是我的數據及其模式:
// _23.02_ANTALYA____________FRANKFURT___________DE_7461_18:20-21:00________________
public static final String FLIGHT_DEFAULT_PATTERN = "\\s+\\d{2}.\\d{2}\\s[A-Z]+\\s+[A-Z]+\\s+[A-Z\\s]{3}[\\d\\s]{5}\\d{2}:\\d{2}-\\d{2}:\\d{2}\\s+";
下划線是空間特征。 現在我需要一個將每個正則表達式術語划分為數據的類。 例如
\\s+ = " "
\\d{2} = "23"
. = "."
\\d{2} = "02"
\\s = " "
[A-Z]+ = "ANTALYA"
等等......必須按模式排序。
我怎么能這樣做或者有一個圖書館嗎?
正如@devnull所提到的,你應該使用捕獲組 :
(\s+)(\d{2})(.)(\d{2})(\s)([A-Z]+)(\s+)([A-Z]+)(\s+)([A-Z\s]{3})([\d\s]{5})(\d{2}:\d{2})(-)(\d{2}:\d{2})(\s+)
請參閱Regex101上此正則表達式的完整說明。
然后,您將使用以下內容匹配文本並提取單個值:
String text = " 23.02 ANTALYA FRANKFURT DE 7461 18:20-21:00 ";
Pattern pattern = Pattern.compile("(\\s+)(\\d{2})(.)(\\d{2})(\\s)([A-Z]+)(\\s+)([A-Z]+)(\\s+)([A-Z\\s]{3})([\\d\\s]{5})(\\d{2}:\\d{2})(-)(\\d{2}:\\d{2})(\\s+)");
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
for (int i = 1; i < matcher.groupCount(); i++) {
System.out.println(matcher.group(i));
}
}
為了更容易提取特定字段,您可以(在Java 7及更高版本中)使用命名捕獲組:
(?<LeadSpace>\s+)(?<Day>\d{2})(.)(?<Month>\d{2})...
然后,您可以使用以下內容來獲取每個命名組:
...
if (matcher.find()) {
System.out.println(matcher.group("LeadSpace"));
System.out.println(matcher.group("Day"));
System.out.println(matcher.group("Month"));
...
}
我發現了一種不同的方式。 我用手分開了碎片。
// _24.02_MAURITIUS_________HAMBURG________________via:FRA_DE/LH____08:30-20:05_____
public static final List<String> FLIGHT_VIA_PATTERN = Arrays.asList( "\\s+", "\\d{2}", "\\.", "\\d{2}", "\\s+", "[A-Z]+", "\\s+", "[A-Z]+", "\\s+", "via:", "[A-Z\\s]{4}", "[A-Z]{2,3}", "/",
"[A-Z]{2,3}", "\\s+", "\\d{2}", ":", "\\d{2}", "\\-", "\\d{2}", ":", "\\d{2}", "\\s+" );
在此之后我使用了一個循環,一切都很好。 這個問題可以關閉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.