2014-03-25 21 views
1

我的目標字符串看起來像這樣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

如果'num'必須是在字符串的開頭,使用'^'(而不是'\\ b')。 – ajb

+0

你說的字符串必須以'num'開始,那麼爲什麼你在'num'之前匹配'.'? –

+0

當你說「子串的開始索引」時,你在說什麼子串?如果你的意思是以'num'開頭的那個,那麼因爲你希望'num'在字符串的開頭,那麼它不會總是爲0嗎? – ajb

回答

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)); 
} 
+0

啊,這似乎工作! (還沒有測試過所有的情況,但是+1,謝謝yoU !!!) –

+0

@OneTwoThree不客氣:) –

1

在你的正則表達式中使用這個看後面的(?<=\\s|^)而不是\\b。它意味着在空格之前,或者在字符串的開頭。這樣它就不會從任何非白色字符串中選取num