2016-10-27 8 views
1

Формат Я хочу, чтобы проверитьвыражение Java: Не допускать одиночные кавычки в середине или Разрешить одиночные кавычки с двойной обратный слеш

  1. Начните с одиночной кавычки (после левой обшивкой)
  2. End с одной цитатой (после того, как правая отделка)
  3. В середине: ни одна цитата не имеет права или разрешить его, но он должен быть экранирован, используя двойной обратный слэш

Образцы

'abc' --> valid 
'abc\\'def' --> valid 
'abc'def' --> invalid 

То, что я пытался

public static void main(String[] args) { 

    final Pattern pat = Pattern.compile("\\s*\\'[^']+\\'\\s*", Pattern.CASE_INSENSITIVE); 

    System.out.println(pat.matcher("'abc'").matches()); // Out: true 
    System.out.println(pat.matcher("'abc\\'def'").matches()); //Out: false, expected true 
    System.out.println(pat.matcher("'abc'def'").matches()); // out false 
} 

Я имею вопрос с этим правилом:

allow a single quote in middle but it must be escaped by \\ 

Любой помогает? Благодаря!

+0

'окончательный шаблон погладить = Pattern.compile (" \ \ s * '[^' \\\\] * (?: \\\\. [^ '\\\\] *) *' \\ s * ");' –

+0

'' 'abc \\' def ''' это строка '' abc \' def'', * not * строка '' abc \\ 'def''. – Andreas

+0

@Andreas: То, что вы говорите, ясно, как день. OP также должно соответствовать экранированным кавычкам между первой и последней одинарными кавычками. –

ответ

1

Вам нужно

final Pattern pat = Pattern.compile("\\s*'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'\\s*"); 

См Java demo.

Детали:

  • \s* - 0+ пробельные
  • ' - одна цитата
  • [^'\\]* - 0+, кроме ' символов и \
  • (?:\\.[^'\\]*)* - ноль или более последовательностей
    • \\. - любой побег, кроме символа линии (добавить Pattern.DOTALL, чтобы соответствовать любому символу вкл.строки)
    • [^'\\]* - 0+ символы, отличные от ' и \
  • ' - одна цитата
  • \s* - 0+ пробельные символы
+0

'' 'abc \\' def '"' является строкой '' abc \' def'', с одним обратным слэшем, и ваш код принимает его. Следует принимать только, если перед символом '' 'предшествует обратная косая черта * double *. Истинный тест, вероятно, должен состоять в том, что '' 'должно предшествовать * четное число обратных косых черт. – Andreas

+0

@Andreas: Look - 'System.out.println (pat.matcher (" 'abc \\' def '"). Matches()); // Out: false, expected true' - перед одиночной цитатой есть только 1 * буквальный * обратный слэш. Если вы посмотрите демоверсию онлайн-кода, она вернет ожидаемое значение (true). –

+1

Правильный ответ. Спасибо! – Loc

1

Попробуйте это («чистую» форму регулярных выражений для удобства чтения, потребности спасаясь в строке Java):

\s*\'([^'\\]|\\')*\'\s* 

Внутри строки, мы принимаем произвольное число вхождений либо символов, которые не являются ' или \ , или точно escape-последовательность \'. Обратите внимание, что это запретит обратную косую черту перед другими символами, так как обычно работают escape-символы. (Я также предлагаю использовать * оценщик, чем + для того, чтобы обеспечить для пустых строк.)

+0

Это сработало. Благодаря! Upvote! – Loc

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