java中的重复正则表达式模式
我想读取一个包含以下内容的文本文件,我正在尝试使用regex将内容匹配并拆分为两个优先级队列的不同字符串,以创建基于堆的优先级队列任务调度器。但首先,我需要确保我使用扫描仪读取的文本文件的格式正确,首先是一个包含字母数字的任务,然后是一个非负整数(到达时间)和一个自然数(截止时间)。以下是文本文件中正确格式的输入:java中的重复正则表达式模式,java,regex,pattern-matching,repeat,Java,Regex,Pattern Matching,Repeat,我想读取一个包含以下内容的文本文件,我正在尝试使用regex将内容匹配并拆分为两个优先级队列的不同字符串,以创建基于堆的优先级队列任务调度器。但首先,我需要确保我使用扫描仪读取的文本文件的格式正确,首先是一个包含字母数字的任务,然后是一个非负整数(到达时间)和一个自然数(截止时间)。以下是文本文件中正确格式的输入: 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 t
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,}
)