java - 正则表达式解析器逐步Java

标签 java regex

这是我的数据及其模式:

// _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 提到的,您应该使用 capturing groups :

(\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"));
    ...
}

关于java - 正则表达式解析器逐步Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21380891/

相关文章:

java - 监控文件更改

java - Joda Time - 月份的日期和年份的月份不返回 2 位数字输出

正则表达式删除小数点后不必要的零

php - 如果网址有index.php/somefileOrsomedirectory,如何重定向

javascript - 查找带空格的字符

java - 无法在 Dataflow SDK 2.1.0 中创建可执行 Jar

Java - 一次分割和修剪

java - EmptyByteBuf出现在Netty服务器的Decoder链中

REGEX:从字符串中提取路径

正则表达式直到但不包括