Примите во внимание, что, если Вы собираетесь быть выполнением большого количества поисков, существуют контейнеры STL, которые лучше для этого. Я не знаю, каково Ваше приложение, но ассоциативные контейнеры как станд.:: карта может быть достойной рассмотрения.
станд.:: вектор является предпочтительным контейнером, если у Вас нет причины для другого, и поиски значением могут быть такой причиной.
Граница слова в большинстве диалектов регулярных выражений - это позиция между \ w
и \ W
(символ, не являющийся словом), или в начало или конец строки, если она начинается или заканчивается (соответственно) символом слова ( [0-9A-Za-z _]
).
Итак, в строке "- 12 "
, он будет соответствовать перед 1 или после 2. Тире не является словесным символом.
Граница слова может находиться в одной из трех позиций:
Символы слова являются буквенно-цифровыми; знака минус нет. Взято из Учебник по регулярным выражениям .
Граница слова - это позиция, которой либо предшествует символ слова и не следует за ним, либо за которой следует символ слова и не предшествует один.
Ознакомьтесь с документацией по граничным условиям:
http://java.sun.com/docs/books/tutorial/essential/regex/bounds.html
Ознакомьтесь с этим образец:
public static void main(final String[] args)
{
String x = "I found the value -12 in my string.";
System.err.println(Arrays.toString(x.split("\\b-?\\d+\\b")));
}
Когда вы распечатываете его, обратите внимание, что результат следующий:
[Я нашел значение - в своей строке.]
Это означает, что символ «-» не воспринимается как находящийся на границе слова, потому что он не считается символом слова. Похоже, @brianary как бы опередил меня, поэтому он получил голосование "за".
Я считаю, что ваша проблема связана с тем, что -
не является словесным символом. Таким образом, граница слова будет соответствовать после -
, и поэтому не будет захватывать ее. Границы слов совпадают перед первым и после последнего символа слова в строке, а также в любом месте, где перед ним стоит символ слова или не-слово, а после - наоборот. Также обратите внимание, что граница слова - это совпадение нулевой ширины.
Одна из возможных альтернатив -
(?:(?:^|\s)-?)\d+\b
Это будет соответствовать любым числам, начинающимся с пробела и необязательного тире и заканчивающимся границей слова. Он также будет соответствовать числу, начинающемуся в начале строки.
Я думаю, что это граница (т. Е. Следующий за ним символ) последнего совпадения или начало или конец строки.