【问题标题】:Java - Extract strings with RegexJava - 使用正则表达式提取字符串
【发布时间】:2009-08-03 22:27:36
【问题描述】:

我有这个字符串

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~'
您对如何将这些字符串与正则表达式匹配有任何想法吗?

更新

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

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

【问题讨论】:

  • 你能显示你的代码吗?这应该与 06:30 匹配,前提是其他一切都井井有条。

标签: java regex


【解决方案1】:

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 位数字)。我会给你一个更接近的例子来说明你正在寻找什么,但是对可能输入的描述有点模糊。

【讨论】:

  • 谢谢 Adam,我对 Matcher API 感到很困惑
  • 嗨亚当,我输入的格式总是一样的。我需要提取 XX~ 字符串之后的 2 小时和数字(在示例的情况下为 1234)。该数字可以是 {3,4} 位。
  • 希望这对其他人有所帮助。您需要在调用 m.group() 之前调用 m.matches()(或 m.find()),否则它会说没有任何匹配项(因为它还没有寻找任何匹配项) ,至少这是在 Android 上发生的事情。
猜你喜欢
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多