在 java 中重复正则表达式模式
repeating regex pattern in java
我想读取一个包含以下内容的文本文件,我正在尝试使用正则表达式匹配并将内容拆分为 2 个优先级队列的不同字符串,以制作基于堆的优先级队列任务调度程序。但首先,我需要确保格式在我使用扫描仪读取的文本文件中是正确的,它以包含字母数字字母的任务开始,后跟一个非负整数(到达时间)和一个自然数(截止时间)。以下是正确格式的文本文件中的输入:
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,}
^
以任何 space \s*
0 次或更多次开始
[a-zA-Z0-0]*
是字母数字0次或多次,指任务
\s+
是不同任务属性之间的白色space
\d+
是到达和截止时间
\s*
以白色结束 spaces 在不同任务之间出现 0 次或更多次
{1,}
在()
括号后指定最小重复次数为1,没有指定最大重复次数
问题是 ^
,它要求匹配项位于输入序列的开头,并且除第一个匹配项之外的任何匹配项都不满足该条件。
尝试将第一部分移出组:
^\s*([a-zA-Z0-9]*\s+\d+\s+\d+\s*){1,}
顺便说一句,{1,}
可以替换为单个 +
。
另请注意,根据您应用正则表达式的方式,您可能不需要用 ^
和 $
包裹表达式(例如 String.matches()
或 Matcher.matches
隐含地做)或者你可能必须这样做(取决于你的需要),例如在末尾添加一个 $
以要求在匹配后不允许进行任何操作(如果那样会违反您的文件格式)。
如果您还想提取匹配项,则需要一种稍微不同的方法,即使用 Matcher.find()
并删除最后一部分 ({1,}
)。
我想读取一个包含以下内容的文本文件,我正在尝试使用正则表达式匹配并将内容拆分为 2 个优先级队列的不同字符串,以制作基于堆的优先级队列任务调度程序。但首先,我需要确保格式在我使用扫描仪读取的文本文件中是正确的,它以包含字母数字字母的任务开始,后跟一个非负整数(到达时间)和一个自然数(截止时间)。以下是正确格式的文本文件中的输入:
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,}
^
以任何 space \s*
0 次或更多次开始
[a-zA-Z0-0]*
是字母数字0次或多次,指任务
\s+
是不同任务属性之间的白色space
\d+
是到达和截止时间
\s*
以白色结束 spaces 在不同任务之间出现 0 次或更多次
{1,}
在()
括号后指定最小重复次数为1,没有指定最大重复次数
问题是 ^
,它要求匹配项位于输入序列的开头,并且除第一个匹配项之外的任何匹配项都不满足该条件。
尝试将第一部分移出组:
^\s*([a-zA-Z0-9]*\s+\d+\s+\d+\s*){1,}
顺便说一句,{1,}
可以替换为单个 +
。
另请注意,根据您应用正则表达式的方式,您可能不需要用 ^
和 $
包裹表达式(例如 String.matches()
或 Matcher.matches
隐含地做)或者你可能必须这样做(取决于你的需要),例如在末尾添加一个 $
以要求在匹配后不允许进行任何操作(如果那样会违反您的文件格式)。
如果您还想提取匹配项,则需要一种稍微不同的方法,即使用 Matcher.find()
并删除最后一部分 ({1,}
)。