Ява заменит все - PullRequest
       1

Ява заменит все

2 голосов
/ 28 мая 2011

Я пытаюсь заменить некоторые слова из строки и использовать следующий код

someMoreString = someString.replaceAll("\\b(shoe||apple|search|employee|expert)\\b", "");

Работает нормально. Сегодня я обнаружил, что это не заменяет некоторые слова. Список замены длинный Я не могу проверить все. Однако я обнаружил, что search слово никогда не заменялось в файлах. Я сомневаюсь, что таких случаев может быть больше.

Есть идеи, почему это происходит? Как я могу это остановить?

Редактировать

Спасибо всем за ваши ответы. Я нашел решение: -)

Я добавил две строки в строке замены, которые и стали причиной этой проблемы. Например:

someMoreString = someString.replaceAll ("\ b (чистка || apple | поиск | сотрудник | эксперт) \ b", "");

Я не знаю, почему он не дал ошибку и почему он заменил некоторые слова.

Ответы [ 2 ]

3 голосов
/ 28 мая 2011

Ответ на обновленный вопрос

Проблема с вашей двойной трубой заключалась в том, что она будет искать совпадения для замены и, следовательно, заменять любое единственное вхождение чего-либо, совпадающего с первым словом («башмак»), и, если оно не работает, искать следующее потенциальное совпадение , которая является пустой строкой (между двумя трубами). Таким образом, вы найдете эти совпадения и замените их (как ни странно) пустыми строками. Поскольку совпадение было найдено для этой позиции, оно переключается на следующие потенциальные позиции и не проверяет другие слова для этой позиции.

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

Это не привело к ошибке, потому что синтаксис действителен, и есть законные случаи, когда вы хотите искать пустые строки для вставки символов.


Оригинальный ответ

Сохраняет похожие ошибки, с которыми сталкиваются другие.

Это, очевидно, работает, поэтому осталось всего несколько вариантов:

  1. Вам необходимо присвоить возвращаемое значение (строка неизменна в Java, , как также упоминается Эраном )
  2. В строке есть некоторые непечатаемые символы;
  3. При чтении ввода и сравнении возникает проблема с кодировкой;
  4. Ваше слово ограничено чем-то, что не регистрирует границу.
  5. Требуется поиск без учета регистра (вместо этого используйте Pattern.compile(regex, flags).matcher(str).replaceAll(repl) с флагом CASE_INSENTIVE для компиляции шаблона )
  6. В другом месте что-то не так, что мы не можем видеть, потому что вы даете:
    • ни весь код
    • ни входные данные.

Пожалуйста, предоставьте больше кода и свой вводный отрывок.

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

Это частично переписано другого ответа, который я дал на этот вопрос о , почему метод java String.contains не возвращает правильно найденные совпадения .

2 голосов
/ 28 мая 2011

«Сегодня я обнаружил, что это не заменяет некоторые слова»

Я думаю, что без назначения вы не замените ни слова, ни слова, ни слова.Строковые операции являются неизменяемыми, попробуйте это:

someString = someString.replaceAll("\\b(apple|search|employee|expert)\\b", "");

образец теста:

public class StringTests {

    @Test
    public void replaceAllTest() {      
        String someString ="bla bla search bla";
        System.out.println(someString);
        someString.replaceAll("\\b(apple|search|employee|expert)\\b", "");
        System.out.println(someString);
        someString = someString.replaceAll("\\b(apple|search|employee|expert)\\b", "");
        System.out.println(someString);

        assertEquals(someString, someString.replaceAll("\\b(apple|search|employee|expert)\\b", ""));
    } 

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...