2012-05-09 1 views
0

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

patternMatcher = Pattern.compile(searchString); 
while ((line = readLine()) != null) { 
    Matcher regexMatcher = patternMatcher.matcher(line); 
     if (regexMatcher.lookingAt()) { 
      line = regexMatcher.replaceAll(replaceString); 

..so на

Эта логика работает до тех пор, как строка поиска находится в начале каждой строки в файле. в противном случае совпадение шаблонов не происходит. Может кто-нибудь предложить решение?

например. Мой поиск Строка "Это" и заменить строку является "Это"
Входной файл содержит: This is not This funny
Выход: That is not That funny

Но когда
Входной файл содержит: 007 This is not This funny
Выход: 007 This is not This funny

ответ

1

Разве это не должно быть ...?

patternMatcher = Pattern.compile(searchString); 
while ((line = readLine()) != null) { 
    Matcher regexMatcher = patternMatcher.matcher(line); 
     while (regexMatcher.find()) { 
      line = regexMatcher.replaceAll(replaceString); 

Примите во внимание, что quatifier может повлиять на результаты, perhapaps строка поиска должна быть "(это) +" или "(это) +?".

+0

Спасибо тонну. Метод поиска работает. Глупо от меня! – user1384205

+0

@ user1384205 Вы должны перенести ответы, которые работают на вас, и выбрать один из них в качестве окончательного ответа. –

0

Если вы ищете постоянную строку, а не шаблон, существует ряд причин, по которым вам не следует использовать регулярное выражение:

  • Пользователь может ввести символ, который имеет особое значение в грамматике регулярных выражений.
  • Регулярные выражения медленны по сравнению с поиском подстроки.
  • Вы не хотите разрешать пользователю больше функций (с использованием соответствия регулярных выражений), чем вы планируете использовать.

Вместо этого используйте String.indexOf и/или String.replace.

while ((line = readLine()) != null) 
    if (line.indexOf(searchString) != -1) 
     line.replace(searchString, replaceString); 
+0

Файлы, работающие иногда с несколькими мегабайтами, и приложение очень интенсивно. Причина, по которой я решил использовать регулярное выражение для манипуляции с строкой, была такой же, поскольку я читал бы поток вместо того, чтобы читать его по строкам. Пожалуйста, поправьте меня, если im worng. – user1384205

+0

Если вам нужна хорошая производительность ввода-вывода, посмотрите на «java.nio» (новый ввод-вывод). Если вы хотите прочитать строку с NIO, используйте 'BufferedReader.readLine()' в потоке NIO. Все это не имеет никакого отношения к тому, будете ли вы использовать регулярное выражение или нет. – alexg

0

Я не знаком с Java, но в соответствии с документами lookingAt смотрит на начало строки. Я бы просто пропустил поиск матча и слепо запустил replaceAll независимо от того, есть ли матч; он ничего не заменит, если нет совпадения.

Если по какой-либо причине вам необходимо найти соответствие перед тем, как заменить (что является расточительным), правильная функция - find. См. http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Matcher.html

+0

Спасибо тонну. В моем случае это было неправильное использование. найти работу хорошо. – user1384205

+0

Имейте в виду, что 'String.replaceAll()' компилирует регулярное выражение из строки поиска. Если вам это не нужно, используйте 'String.replace()'. – alexg

0

Если память не является проблемой, вы можете прочитать весь файл как строку и использовать public String replaceAll(String regex, String replacement) в String API.

 Смежные вопросы

  • Нет связанных вопросов^_^