Как изменить это регулярное выражение, чтобы оно не учитывало регистр при поиске ругательств? - PullRequest
0 голосов
/ 10 октября 2011

В настоящий момент этот фильтр ненормативной лексики находит darn и golly, но не Darn или Golly или DARN или GOLLY.

List<String> bannedWords = Arrays.asList("darn", "golly", "gosh");

StringBuilder re = new StringBuilder();
for (String bannedWord : bannedWords)
{
    if (re.length() > 0)
        re.append("|");
    String quotedWord = Pattern.quote(bannedWord);
    re.append(quotedWord);
}

inputString = inputString.replaceAll(re.toString(), "[No cursing please!]");

Как его можно изменитьбыть нечувствительным к регистру?

Ответы [ 3 ]

3 голосов
/ 11 октября 2011

Вам необходимо установить флаг CASE_INSENSITIVE или просто добавить (?i) в начало вашего регулярного выражения.

StringBuilder re = new StringBuilder("(?i)");

Вам также нужно изменить условное выражение на

if (re.length() > 4)

Однако, возможно, лучше установить флаг с помощью ответа @ ratchetFreak.Это позволяет вашему состоянию оставаться таким же (что более интуитивно понятно) и дает вам четкое представление о том, что происходит в коде.

Для получения дополнительной информации см. этот вопрос иконкретный этот ответ , который дает некоторое приличное объяснение использования регулярных выражений в Java.

3 голосов
/ 10 октября 2011

Начните выражение с (?i).

Т.е. измените re.toString() на "(?i)" + re.toString().

Из документации Pattern

(?idmsux-idmsux) Ничего, но включает флаги совпадений i d m s u x вкл. - выкл.

, где i - флаг CASE_INSENSITIVE.

1 голос
/ 11 октября 2011

использовать предварительно скомпилированный java.util.regex.Pattern

Pattern p = Pattern.compile(re.toString(),Pattern.CASE_INSENSITIVE);//do this only once

inputString = p.matcher(inputString).replaceAll("[No cursing please!]");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...