1

我有字符串:

    String myString1 = "22223 2342 1 98 333 3 665"

    String myString2 = "22323 3 222 34 33 1 98"

我只想提取具有 1 位数字的值,然后是空格,然后只有两位数字。

    private static final Pattern p3DigitsGap = Pattern.compile(".*\\b\\d\\s\\d{2}\\b.*");

在上述两个字符串中,我希望提取“1 98”,如果模式位于字符串的末尾,我不能只用空格分割。

        Matcher matcher = p3DigitsGap.matcher(myString1);
        if (matcher.find()) {
            Log.i("Matcher found");
            while (matcher.find() == true) {
                Log.i("Matcher is true");
                String extract = matcher.group(1);
                Log.d("extract: " + extract);
            }
        }

如果我删除 while 循环,则永远不会填充字符串提取并引发越界异常。我在 while 循环中添加了 matcher.find() 不等于 true。

我尝试将我的模式交换为:

    Pattern p3DigitsGap = Pattern.compile("[^0-9a-z]\\d\\s\\d{2}[^0-9a-z]");

我认为使用 .*\\b 可能会导致问题,但我得到了相同的结果。

请有人可以帮助我了解我哪里出错了。

提前致谢。

答案编辑:我将 Reimeus 的答案标记为正确,因为它通过使用具有上述正则表达式的组来工作。另请参阅 Tim Pietzcker 的答案,以了解改进我原来的正则表达式的替代解决方案。

4

3 回答 3

2

匹配时最好使用组,因此您可以使用:

Pattern p3DigitsGap = Pattern.compile(".*\\b(\\d\\s\\d{2})\\b.*");
Matcher matcher = p3DigitsGap.matcher(myString1);
if (matcher.find()) {
   Log.i("Matcher is true");
   String extract = matcher.group(1);
   Log.d("extract: " + extract);
}
于 2012-09-28T11:02:19.527 回答
1

你没有定义组,你可以使用定义一个组( and ),我认为你的代码应该是:

 private static final Pattern p3DigitsGap = Pattern.compile("\\b\\d\\s\\d{2}\\b");
 Matcher matcher = p3DigitsGap.matcher(myString1);
 while (matcher.find()) {
   Log.i("Matcher is true");
   String extract = matcher.group(0);
   Log.d("extract: " + extract);
 }
于 2012-09-28T11:05:24.743 回答
1

两个问题:

  • 您的正则表达式中没有任何捕获组,因此任何匹配的最高有效组将是.group(0)(整个匹配)。

  • 您的示例字符串仅匹配一次,但您调用matcher.find()了两次,因此第二次调用(在while循环中)返回不匹配。

尝试这个:

Pattern p3DigitsGap = Pattern.compile("\\b\\d\\s\\d{2}\\b");
Matcher matcher = p3DigitsGap.matcher(myString1);
if (matcher.find()) {
    Log.i("Matcher found");
    String extract = matcher.group(0);
    Log.d("extract: " + extract);
}
于 2012-09-28T11:00:57.293 回答