Java - 使用正则表达式提取字符串

2022-09-01 21:57:44

我有这个字符串

String myString ="A~BC~FGH~~zuzy|XX~ 1234~ ~~ABC~01/01/2010 06:30~BCD~01/01/2011 07:45";

我需要提取这3个子字符串
1234
06:30
07:45

如果我使用此正则表达式\\d{2}\:\\d{2}我只能提取第一个小时06:30

Pattern depArrHours = Pattern.compile("\\d{2}\\:\\d{2}");
Matcher matcher = depArrHours.matcher(myString);
String firstHour = matcher.group(0);
String secondHour = matcher.group(1); (IndexOutOfBoundException no Group 1)

matcher.group(1) 引发异常。
我也不知道如何提取1234。这个字符串可以改变,但它总是在'XX〜'
之后,你对如何将这些字符串与正则表达式匹配有任何想法吗?

更新

感谢亚当的建议,我现在有这个正则表达式匹配我的字符串

Pattern p = Pattern.compile(".*XX~ (\\d{3,4}).*(\\d{1,2}:\\d{2}).*(\\d{1,2}:\\d{2})";

我匹配数字,并与 matcher.group(1) 匹配 2 小时;matcher.group(2);matcher.group(3);


答案 1

该函数期望采用单个整数参数:从 1 开始的捕获组索引。索引 0 是特殊的,表示“整个匹配”。捕获组是使用一对括号 “” 创建的。括号内的任何内容都是捕获的。组从左到右(同样,从 1 开始)通过左括号(这意味着组可以重叠)进行编号。由于正则表达式中没有括号,因此不能有组 1。matcher.group()(...)

Pattern 类上的 javadoc 涵盖了正则表达式语法。

如果你正在寻找一个可能重复出现几次的模式,你可以重复使用find(),直到它返回false。 每次迭代一次,然后返回与该时间匹配的内容。Matcher.Matcher.group(0)

如果你想构建一个大的正则表达式,一次匹配所有东西(我相信这是你想要的),那么围绕你想要捕获的三组东西中的每一组,放一组捕获括号,使用,然后n分别是1,2和3。当然,也可能返回 false,在这种情况下,模式不匹配,并且您无法检索任何组。Matcher.match()Matcher.group(n)Matcher.match()

在您的示例中,您可能想要做的是让它匹配前面的一些文本,然后启动捕获组,匹配数字,结束捕获组等...我对你的确切输入格式不够了解,但这里有一个例子。

假设我有以下形式的字符串:

Eat 12 carrots at 12:30
Take 3 pills at 01:15

我想提取数量和时间。我的正则表达式看起来像这样:

"\w+ (\d+) [\w ]+ (\d{1,2}:\d{2})"

代码将如下所示:

Pattern p = Pattern.compile("\\w+ (\\d+) [\\w ]+ (\\d{2}:\\d{2})");
Matcher m = p.matcher(oneline);
if(m.matches()) {
    System.out.println("The quantity is " + m.group(1));
    System.out.println("The time is " + m.group(2));
}

正则表达式表示“包含单词、空格、一个或多个数字(在第 1 组中捕获)、一个空格、一组以空格结尾的单词和空格的字符串,后跟一个时间(在第 2 组中捕获,时间假定小时始终为 0 填充为 2 位数字)。我会给出一个更接近你正在寻找的东西的例子,但对可能输入的描述有点模糊。


答案 2