找到匹配区域的开头(java regex)

时间:2014-03-25 16:07:02

标签: java regex

假设我感兴趣的字符串与这些num3.anum4.b等相似。 (但我不希望它与这些foo.num3.awhatever.num2.b

相匹配

我有这个正则表达式匹配他们Pattern p = Pattern.compile("[^\\.]\\bnum(\\d*)(?=\\.)";

给定此输入字符串:(num3.a)

Matcher m = p.matcher("(num3.a)");
if (m.find())
    System.out.println(m.start()); // This would print 0 rather than 1  WHY?

如何更改代码以便打印1? (因为1n的索引,这是我感兴趣的模式的开头)

3 个答案:

答案 0 :(得分:2)

如果您在num3.a中进行了强制转换,则应扩展您的论坛。括号表示一个组,可用于在您的比赛中进行解决。

[^\\.]\\b(num\\d*)(?=\\.)

然后您可以使用

访问该组

start(0)end(0)

Pattern p = Pattern.compile("\\b(num\\d*\\.a)");
String input = "fffffffffffff(num3.a)fffffffffffffffffsdfsdf";
Matcher m = p.matcher(input);
if (m.find())
{
    System.out.println(m.start(0));
    System.out.println(input.substring(m.start(0), m.end(0)));
}

将输出

14
num3.a

答案 1 :(得分:0)

方法Matcher#regionStart()

  

报告此匹配器区域的起始索引。

这并不表示匹配的开始,只是表示检查匹配的区域的开始。

使用find()start()查找匹配的开头。

现在你改变了你的模式。 [^\\.]匹配任何不是点的东西。 (既不是那些,也是匹配的。 (位于给定String的索引0处。

答案 2 :(得分:0)

Pattern p = Pattern.compile("\\,\\d*");
    String inpu = "Hotel Class : 5,106936 ";
    Matcher m = p.matcher(inpu);

    if (m.find())
    {
        System.out.println(inpu.substring(m.start(0), m.end(0)));
    }

输出为“ 5,106936”