игнорировать новую строку для поиска иглы в стоге сена и сохранять текстовые позиции

61
7

Я пытаюсь "обернуть" поиск, в основном игнорируя \n при использовании ether indexOf или шаблона регулярных выражений. Я не могу просто удалить все символы новой строки, так как найденные индексы ошибочны.

Например:

Matcher matcher = Pattern.compile("dog").matcher("cat\n do\ng cow");
matcher.find();
int start = matcher.start();
int end = matcher.end();
System.out.println("Start: "+start+" End: "+end);

Должен выводиться:

Start: 5 End: 9 

Если я удалю новые строки,

Matcher matcher = Pattern.compile("dog").matcher("cat\n do\ng cow".replaceAll("\n",""));

Тогда индексы будут испорчены:

Start: 4 End: 7

Примечание. Я также собираюсь использовать более сложное регулярное выражение, чем в примере.

Я реализую функцию find в текстовом редакторе и пытаюсь создать опцию 'wrap around'. Есть идеи?

спросил(а) 2012-03-27T21:01:00+04:00 8 лет, 11 месяцев назад
1
Решение
74

Вам нужно взять ключевое слово поиска и подготовить его, вставив дополнительный разрыв строки после каждого символа перед поиском в эй-стеке. Рассмотрим этот код:

String needle = "dog";
String regex = needle.replaceAll("(.(?!$))", "$1\n?"); // inserts line breaks
// regex now becomes "d\n?o\n?g"
Pattern p = Pattern.compile(regex);
Matcher matcher = p.matcher("cat do\ng cow");
if (matcher.find()) {
int start = matcher.start();
int end = matcher.end();
System.out.println("Start: "+start+" End: "+end);
}
else
System.err.println("No match available");

ВЫВОД:

Start: 4 End: 8

Кстати, ваш ожидаемый результат 5 и 9 мне кажется неправильным.

ответил(а) 2012-03-27T23:08:00+04:00 8 лет, 11 месяцев назад
43

myString.replaceAll("\n","");

Попробуй это

ответил(а) 2012-03-27T21:08:00+04:00 8 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема