2016-04-13 2 views
0

У меня возникают проблемы с шаблоном Java. Это моя картина:Регулярное выражение первого символа не соответствует

"^[\\p{L}\\p{Digit}~._-]+$" 

Это соответствует любой букве в US-ASCII, цифры, специальные символы, в основном все, что не будет карабкаться в URL.

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

Я попытался отрицать этот шаблон, но он не скомпилировался должным образом. Также find() ничего не помогло.

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

Я бы предпочел предложение, используя Java Matcher, Pattern или что-то, используя util.regex. Это не необходимость, но проверка каждого символа в строке индивидуально не является решением.

Edit: я придумал лучше регулярное выражение, чтобы соответствовать невыполненным символам URI

+0

'!"? Hello ".subString (0,1) .matches ("^[\\ p {L} \\ p {Digit} .'-.'_] + $ ")'? – Ferrybig

+1

Можете ли вы поделиться каким-то кодом с тем, что вы пытаетесь сделать? Пытается дезинформировать параметры GET/POST? Или весь URL? – Garfield

+2

Зачем использовать 2 '' 'и' .' в одном классе символов? Кроме того, '' -.' создает диапазон (и соответствует ''() * +, -. '), Это специально? BTW, попробуйте 'if (str.matches (" [^ \\ p {L} \\ p {Digit} .'_-]. * ")) {/ * Ошибка! * /} ' –

ответ

1

Попробуйте это:

^[\\p{L}\\p{Digit}.'-.'_]*([^\\p{L}\\p{Digit}.'-.'_]).*$ 

Первый символ не соответствия является группа п ° 1

Я сделал несколько попробовать здесь: http://fiddle.re/gkkzm61

Объяснение:

Я отрицаю ваш шаблон, поэтому я построил это:

[^\\p{L}\\p{Digit}.'-.'_]  [^...] means every character except for 
^      ^   the following ones. 
| your pattern inside | 

Шаблон состоит из 3 частей:

^[\\p{L}\\p{Digit}.'-.'_]* 

Проверки регулярное выражение из первого символа, пока он не встречает нон соответствующий символ

([^\\p{L}\\p{Digit}.'-.'_]) 

Не-сопоставления символов (отрицание) внутри группа по улавливанию

.*$ 

Любой символа до конца строки.

Надеется, что это помогает вам

EDIT:

Правильное регулярное выражению Шоуду быть:

^[\\p{L}\\p{Digit}~._-]*([^\\p{L}\\p{Digit}~._-]).*$ 

Это тот же метод, я только изменить содержание первой и второй часть ,

Я пробовал и, похоже, работает.

+0

Спасибо за ответ. –

+0

Я бы назвал это принятым ответом, но мое начальное регулярное выражение не выполняло свою работу должным образом, поэтому я отредактировал вопрос –

+0

на основе вашего предложения, и после моего редактирования я считаю, что это должен быть правильный отрицательный ответ: '^^[ \\ р {L} \\ р {} ~ Разряд ._-] * ([^ \\ р {L} \\ р {} ~ Разряд ._-]). * $ "' –

0

Попробуйте это один, чтобы найти первый не действительный символ:

Pattern negPattern = Pattern.compile(".*?([^\\p{L}^\\p{Digit}^.^'-.'^_]+).*"); 
Matcher matcher = negPattern.matcher("hel?lo"); 
if (matcher.matches()) 
{ 
    System.out.println("'" + matcher.group(1).charAt(0) + "'"); 
} 
+0

спасибо за помощь, действительно неинтуитивный способ работает с java Matcher –

0

"^[\\p{L}\\p{Digit}.'-.'_]+$" шаблона соответствует любой строке, содержащей 1+ символы, определенные внутри класса символов. Обратите внимание, что двойные ' и . являются подозрительными, и вы можете не знать о том, что '-. создает диапазон и соответствует '()*+,-.. Если это не специально, я думаю, вы хотели использовать .'_-.

Чтобы проверить, если строка начинается с символом, чем определенный в классе символов, вы можете отрицаетесь класс символов, и проверьте, первый символ только строки:

if (str.matches("[^\\p{L}\\p{Digit}.'_-].*")) { 
    /* String starts with the disallowed character */ 
} 

Я также думаю вы можете сократить регулярное выражение до "(?U)[^\\w.'-].*". Во всяком случае, \\p{Digit} может быть заменен на \\d.

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