JAVA регулярное выражение для замены всех вхождений конкретного слова "странный" - PullRequest
0 голосов
/ 07 марта 2020

Кто-нибудь видит что-то не так с этим регулярным выражением, которое у меня есть. Все, что я хочу, - это найти любые вхождения и заменить их тем, какое слово выберет пользователь. Это выражение только изменяет некоторые вхождения, и когда оно делает, оно удаляет предшествующий пробел, и я предполагаю, что объединяет его со словом перед. Также он не должен заменять тогда, там, их, они и они c

private final String MY_REGEX = (" the | THE | thE | The | tHe | ThE  ");

        userInput = JTxtInput.getText();
        String usersChoice = JTxtUserChoice.getText();
        String usersChoiceOut = (usersChoice + " ");


        Pattern pattern = Pattern.compile(MY_REGEX, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(userInput);
        while (matcher.find())
        {
            userInput = userInput.replaceAll(MY_REGEX, usersChoiceOut);
            JTxtOutput.setText(userInput);
            System.out.println(userInput);
        }

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

private final String MY_REGEX = ("the |THE |thE |The |tHe |ThE |THe ");
String usersChoiceOut = (usersChoice + " ");

Ответы [ 2 ]

2 голосов
/ 07 марта 2020

Проблема из-за пробелов в MY_REGEX. Проверьте следующую демонстрацию:

public class Main {
    public static void main(String[] args) {
        String str="This is the eighth wonder of THE world! How about a new style of writing The as tHe";
        // Correct way
        String MY_REGEX = ("the|THE|thE|The|tHe|ThE");
        System.out.println(str.replaceAll(MY_REGEX, "@@@"));
    }
}

Выходы:

This is @@@ eighth wonder of @@@ world! How about a new style of writing @@@ as @@@

, тогда как

public class Main {
    public static void main(String[] args) {
        String str="This is the eighth wonder of THE world! How about a new style of writing The as tHe";
        // Incorrect way
        String MY_REGEX = ("the | THE | thE | The | tHe | ThE");
        System.out.println(str.replaceAll(MY_REGEX, "@@@"));
    }
}

Выходы:

This is @@@eighth wonder of@@@world! How about a new style of writing@@@as tHe
1 голос
/ 08 марта 2020

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

Поскольку вы уже используете Pattern.CASE_INSENSITIVE, вы также можете сопоставить * , за которым следует один пробел, как вы упомянули в обновленном ответе, и используйте встроенный модификатор (?i), чтобы сделать регистр нечувствительным к регистру.

userInput = userInput.replaceAll("(?i)the ", usersChoiceOut);

Если , то не должно быть частью большего слова, вы добавляете границу слова \b перед ним.

(?i)\bthe

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