我如何改进我的正则表达式(这是不行的)

时间:2014-03-25 18:54:34

标签: java regex

我的目标字符串看起来像这些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

那么请你告诉我如何修复我的正则表达式?

2 个答案:

答案 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));
}