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

Я пытаюсь «обернуть» поиск, в основном игнорируя \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

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

Я реализую функцию поиска в текстовом редакторе и пытаюсь создать опцию «обтекания». Любые идеи?


person RedHatter    schedule 27.03.2012    source источник
comment
Что вы имеете в виду под игнорированием их? Вы говорите, что не можете удалить их, потому что индексы будут неправильными, но если вы сделаете indexOf, он будет считать символы новой строки, и вы не будете их игнорировать. Покажите желаемый ввод и вывод, пожалуйста.   -  person Danny    schedule 27.03.2012
comment
Кроме того, пожалуйста, покажите, что вы пытаетесь (с помощью кода), чтобы люди могли попытаться помочь вам найти решение.   -  person Tim Bender    schedule 27.03.2012


Ответы (2)


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

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 не кажется мне правильным.

person anubhava    schedule 27.03.2012
comment
Выглядит хорошо для простых строк, но как насчет более сложных регулярных выражений? Извините, в коде была опечатка - person RedHatter; 28.03.2012
comment
Приведите несколько примеров more complex regex searches. Насколько я понимаю, вы пытаетесь найти иголку в стоге сена, игнорируя символы новой строки между ними (по крайней мере, так сказано в заголовке вопроса). - person anubhava; 28.03.2012

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

Попробуй это

person Nurlan    schedule 27.03.2012
comment
Это заменит новые строки, полностью удалив их из строки. Это испортит индексы. - person RedHatter; 27.03.2012