Получить смещение строки - PullRequest
1 голос
/ 15 июля 2011

У меня есть Array из Strings, который был выделен из строки буфера. Теперь у каждого элемента в массиве есть {value, offset, count, & hash}. Как я могу получить смещение элемента в массиве?

Пример:

String buffer = aVeryLongString;
String[] splitStringArray = buffer.split(regex);

for(String s: splitStringArray) {   
    // Get the offset of each item
    // Do something
}

Ответы [ 6 ]

2 голосов
/ 15 июля 2011
String buffer = aVeryLongString;
String[] splitStringArray = buffer.split(regex);

int offset = -1;
for(String s: splitStringArray) {
    offset = buffer.indexOf(s, offset + 1); // avoid duplicates
    System.out.println(offset);
}

Используя String.indexOf(String str, int offset), вы можете узнать смещение строки. Начинается поиск строки с заданным смещением. Таким образом, использование смещения предыдущей строки решит проблему с дубликатами.

2 голосов
/ 15 июля 2011

Возможно, вы захотите использовать классы регулярных выражений Matcher / Pattern вместо функции String.split.С помощью класса Matcher вы можете перебирать совпадения с помощью find () и получать текущую позицию с помощью end ().

2 голосов
/ 15 июля 2011

String.indexOf (String str) должен работать.

for(String s: splitStringArray) {
    System.out.println(buffer.indexOf(s));
}
0 голосов
/ 08 марта 2014

Скажем, вы хотите разделить buffer пробельными символами. (\S+ обозначает непробельные символы)

String buffer = aVeryLongString;
Pattern p = Pattern.compile("\\S+");
Matcher m = p.matcher(buffer);

while(m.find()) {
  String matchStr = m.group();
  int startOffset = m.start();
  int endOffset = m.end();
  System.out.println("[ " + matchStr + " " + Integer.toString(startOffset) + " " + Integer.toString(endOffset) + " ]");
}
0 голосов
/ 15 июля 2011

Если регулярное выражение всегда соответствует фиксированной длине, тогда смещение будет суммой длин предыдущих строк плюс длина разделенной строки.

Но если длина регулярного выражения не фиксирована... хм, не простая проблема.Я думаю, вам придется повторить логику, которую использует split, чтобы найти фрагменты.

0 голосов
/ 15 июля 2011

String.split () на самом деле не предоставляет способ восстановить эту информацию (без циклического перебора массива и добавления предыдущих длин). Если вам нужна дополнительная информация о полученных подстроках, как эта, вы можете попробовать java.util.Scanner .

Или, как предложил один из других авторов, использовать классы java.util.regex, Pattern и Matcher.

...