我的目标字符串看起来像这些somecrap +num3.whatever-something
。
我想找到NUM<SOMENUMBER><DOT><WHATEVER>
(警告:我不想匹配看起来像这样的字符串:whatever.num3.whatever
)
注意:我希望能够检索子字符串的数字和起始索引(即分别通过myMatcher.group(1)
和myMatcher.start()
)。
所以我尝试了这个正则表达式\\bnum(\\d*)(?=\\.)
,但这符合foo.num3.bar
。
所以我将其更改为[^\\.]\\bnum(\\d*)(?=\\.)
,希望它排除num
以点为前缀的所有字符串,但myMatcher.start()
上的"+(num3.bar)"
会给我索引左边的(
(而不是n
)。 (因为PAREN == NOT DOT
)
那么请你告诉我如何修复我的正则表达式?
答案 0 :(得分:1)
在正则表达式中使用此lookbehind (?<=\\s|^)
而不是\\b
。它表示前面是空格,或者是字符串的开头。这样它就不会从任何非白色字符串的中间选择num
。
答案 1 :(得分:1)
如果您想匹配模式 - num3.whatever
前面没有点或任何其他字母,那么您可以使用负面后卫:
Pattern pattern = Pattern.compile("(?<![.a-zA-Z])num(\\d)\\..*");
Matcher matcher = pattern.matcher("+(num3.bar)");
if (matcher.find()) {
System.out.println(matcher.start() + " : " + matcher.group(1));
}