2015-03-26 3 views
0

Я пишу регулярное выражение, которое может фиксировать значение и любое мБ, кб, гб, байт, который приходит после того, как регулярное выражение:Regex ([mb | kb | gb | b | bytes]) не соответствует 'b' в 'kb' или 'gb' без + после привязок

(?<sizevalue>\p{N}+)(?:\s*)(?<sizetype>[mb|kb|gb|b|bytes]) 

Но когда данный вход «4096 мб», группа sizetype соответствует только «т» и не «B». добавив «+» квантификатор после того, как фигурные скобки выдают значение grop sizetype как «mb». Шаблон был скомпилирован с CASE_INSENSITIVE, так что это не было проблемой. Это работает

(?<sizevalue>\p{N}+)(?:\s*)(?<sizetype>[mb|kb|gb|b|bytes]+) 

В идеале не должны полностью первого регулярного выражения совпадает с «» мб?

+1

Вам необходимо '()', где у вас есть '[]'. Выражение в квадратных скобках соответствует только одному символу. –

ответ

2

Вам нужно использовать группу захвата или не захвата, а не класс символов. только

[mb|kb|gb|b|bytes] матчи один charcater из данного списка, то есть, он может совпадать с m или b или | или k или b, и т.д. Это не рассматривать mb как одно слово и | оператор внутри класса символов будет терять свое особое значение и соответствует только буквальному символу |. Он не будет выполнять операцию ИЛИ.

(?<sizevalue>\p{N}+)(?:\s*)(?<sizetype>(?:mb|kb|gb|b|bytes)\b) 

DEMO

Pattern p = Pattern.compile("(?<sizevalue>\\p{N}+)(?:\\s*)(?<sizetype>(?:mb|kb|gb|b|bytes)\\b)"); 
+0

Итак, в квадратных скобках он соответствует только первому символу в альтернативах и без кванта '+' выплескивает только первый символ? – draklor40

+0

'[mb | kb | gb | b | bytes] +' соответствует mb, bytes, gb, потому что все эти символы включены в класс символов, но это также соответствует 'test',' bg', 'kytes' и т. Д. –

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