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
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)抛出exception。
另外我不知道如何提取1234.这个字符串可以改变,但总是在’XX~’之后
您是否知道如何将这些字符串与正则表达式匹配?

UPDATE

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

 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);

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,在这种情况下模式不匹配,并且您无法检索任何组。

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

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

 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位数。)我会给你一个更接近的例子,但是对可能输入的描述有点模糊。