2009-09-07 2 views
1

Я сделал, что, как я полагал, ошибка в регулярном выражении в Java недавно, но когда я тестирую свой код, я не получаю ожидаемую ошибку.Unescaped "." по-прежнему совпадает с использованием в группе отрицания

Выражение, которое я создал, предназначалось для замены пароля в строке, полученной мной из другого источника. Образец, который я использовал, шел по строкам: «password: [^ \\ s.] *», Идея заключалась в том, что он соответствовал слову «пароль» двоеточия, пробелу, затем любые символы, кроме пробела или полный (период). Затем я заменил бы экземпляр «password: XXXXXX» и, следовательно, замаскировал его.

Очевидная ошибка должна заключаться в том, что я забыл избежать полной остановки. В других словах правильное выражение должно быть «password: [^ \\ s \\.] *». Дело в том, что, если я не уйду от полной остановки, код все еще работает!

Вот некоторые примеры кода:

import java.util.regex.*; 

public class SimpleRegexTest { 

    public static void main(String[] args) { 
     Pattern simplePattern = Pattern.compile("password: [^\\s.]*"); 
     Matcher simpleMatcher = simplePattern.matcher("password: newpass. Enjoy."); 
     String maskedString = simpleMatcher.replaceAll("password: XXXXXX"); 
     System.out.println(maskedString); 
    } 

} 

Когда я запускаю приведенный выше код я получаю следующий результат:

password: XXXXXX. Enjoy. 

Это особый случай, или я полностью пропустил что-то?

(редактирование: изменено на «избежать полной остановки»)

Майкл Borgwardt: Я не мог придумать другой термин, чтобы описать то, что я делал, кроме «отрицания группы», простите за двусмысленность.

Aviator: В этом случае нет, пробела не будет в пароле. Я не делал правил ;-).

(редактирование: согнулся в слэш в тексте без кода, так что отображается правильно, добавлена ​​^, который был в коде, а не текст: - /)

Сундара: Фиксированный двойные слеши, Кажется, что у этого есть свои персонажи-эвакуаторы.

+1

Ваш вопрос немного запутанный - вы не используете группы отрицания в тексте, и говорите об ускорении «пространства», а не о том, как вы думаете, период. –

+0

У меня есть один запрос. Не может быть символом пароля? Почему вы его исключили? – vpram86

+0

Kurley, я думаю, вам не хватает точки Майкла Боргвардта: вы используете [^ \\ s.] * В коде, но [\ s.] * Без^в тексте над ним. Я думаю, что это опечатка в тексте, пожалуйста, исправьте это, поскольку это вызывает много путаницы. – sundar

ответ

10

Атрибут периода (символ ') не должен быть экранирован внутри символьного класса [] в регулярном выражении.

С API:

Обратите внимание, что другой набор метасимволов, в сущности, внутри класса символов, чем вне класса символов. Например, регулярное выражение. теряет свое особое значение внутри класса персонажа, а выражение - становится метасимволом диапазона.

+0

Это правда - но это не его оригинальная проблема, так как он изначально пытался это сделать, не убегая. Тем не менее +1 для справки. :) –

+0

@dtsazza: Я думаю, что _is_ его оригинальная проблема - вопрос в том, почему небезопасный период работает, и Ави дал ответ за него. – sundar

+0

Это был ответ, который я искал, я много раз просматривал страницу Regex в java api и до сих пор не заметил абзаца Avi. Спасибо Ави. – Kurley

0

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

В частности, я понимаю, что вы использовали фрагмент [\s.]* для обозначения «любых символов, кроме пробела или полной остановки (периода)». Это было бы фактически выражено как [^ .]*, используя карету, чтобы свести на нет символы в наборе.

Я не знаю, было ли это просто опечаткой в ​​вашем сообщении или тем, что было на самом деле в вашем коде, но регулярное выражение, которое находится в вашем вопросе, будет соответствовать слову «пароль», двоеточие, пробелу, затем любая последовательность символов обратной косой черты, символов «s» или периодов.

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