java - java中的重复正则表达式模式

标签 java regex pattern-matching repeat

我想读取包含以下内容的文本文件,我尝试使用正则表达式将内容匹配并将其拆分为两个优先级队列的不同字符串,以制作基于堆的优先级队列任务调度程序。但首先,我需要确保使用扫描仪读取的文本文件的格式正确,该文件以包含字母数字字母的任务开始,后跟非负整数(到达时间)和自然数(截止时间)。以下是文本文件中格式正确的输入:

task1 2 3 task2 2 3 task3 2 3 task4 4 5 task5 4 5
task6 7 9 task7 7 9 task8 7 9 task9 7 9
task10 7 9 task11 7 9 task12 7 9 task13 7 9
task14 7 9 task15 7 9 task16 10 11 task17 10 11
task18 10 11 task19 10 11  task20 10 12

我尝试了以下正则表达式代码来尝试检查格式是否正确,但我只能将其与第一个任务属性匹配。除了第一个任务之外,我似乎无法匹配它,这意味着当它继续执行格式重复的其他任务时,正则表达式将失败。知道我的正则表达式有什么问题吗?

(^\s*[a-zA-Z0-9]*\s+\d+\s+\d+\s*){1,}

^从任意空格开始\s* 0次或多次

[a-zA-Z0-0]*是字母数字0次或多次,指的是任务

\s+是不同任务属性之间的空格

\d+是到达时间和截止时间

\s*不同任务之间以空格结尾 0 次或多次

{1,} ()之后括号指定最小重复次数为 1,没有指定最大重复次数

最佳答案

问题是 ^ 它要求匹配位于输入序列的开头,并且除第一个匹配之外的任何匹配都不能满足该条件。

尝试将第一部分移出组:

^\s*([a-zA-Z0-9]*\s+\d+\s+\d+\s*){1,}

顺便说一句,{1,} 可以替换为单个 +

另请注意,根据您应用正则表达式的方式,您不需要用 ^$ 包装表达式(例如 String.matches( )Matcher.matches 隐式执行此操作)或者您可能必须执行此操作(取决于您的需要),例如在末尾添加 $ 以要求匹配后不允许执行任何操作(如果这会违反您的文件格式)。

如果您还想提取匹配项,则需要稍微不同的方法,即使用 Matcher.find() 并删除最后一部分 ({1,})。

关于java - java中的重复正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32942953/

相关文章:

java - 请求路径 JAX-RS

java - 将 P12 转换为 JKS 证书 Adode AIR 到原生 Android 问题

php - 将正则表达式与Elastica一起使用

java - 如何从java中生成的模式中获取原始代码?

pattern-matching - 在 ML 中使用 let 解构元组

haskell - 新数据的模式匹配

java - 当仅给出点和距离时,如何在 3D 空间中获得圆路径?

Java:空循环使用多少时间?

ruby - 匹配ruby中的正则表达式

Java:通过正则表达式字符串解析用元素丰富 xml