假设我感兴趣的字符串与这些num3.a
,num4.b
等相似。
(但我不希望它与这些foo.num3.a
,whatever.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
? (因为1
是n
的索引,这是我感兴趣的模式的开头)
答案 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)
报告此匹配器区域的起始索引。
这并不表示匹配的开始,只是表示检查匹配的区域的开始。
使用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”