Java - 使用Regex提取字符串

时间:2009-08-03 22:27:37

标签: java regex

我有这个字符串

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

我需要提取这3个子串 的 1234
06:30
7时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〜'之后 您是否知道如何将这些字符串与正则表达式匹配?

更新

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

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

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

1 个答案:

答案 0 :(得分:40)

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

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

如果您正在寻找可能会重复多次的模式,您可以反复使用Matcher. find(),直到它返回false。 Matcher.group(0)每次迭代一次,将返回与该时间匹配的内容。

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

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

让我们说我有这种形式的字符串:

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位数。)我会给出你正在寻找的更接近的例子,但可能的输入描述有点模糊。