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