2014-12-02 3 views
0

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

My String возвращается из сканера DataMatrix. Например,

String contained = "~ak4,0000D" 

Теперь я хочу протестировать эту строку, если она соответствует шаблону из регулярного выражения.

Строка начинается каждый раз «~».

После этого в этом примере «ak» следуют два нижних шариковых символа.

После этого следует шестнадцатизначное значение «4,0000». Основная проблема здесь, потому что запятая может сидеть где угодно в этом значении, но запятая должна содержаться в ней. Например, это может быть «, 16000» или «150,00» или «2,8000».

В последней позиции должен быть один из этих символов A B C D E F G H J K L M в верхнем регистре.

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

ответ

1

Регулярное выражение будет ~[a-z]{2}(?=[\d\,]{6})((\d)*\,(\d)*)[A-H|J-M]{1}$ Вы можете создавать и тестировать выражения here

boolean isMatch(String STRING_YOU_WANT_TO_MATCH) 
{ 
    Pattern patt = Pattern.compile(YOUR_REGEX_PATTERN); 
    Matcher matcher = patt.matcher(STRING_YOU_WANT_TO_MATCH); 
    return matcher.matches(); 
} 
+0

'[А-М]' не соответствует запрос в OP. 'A B C D E F G H J K L M' –

+0

@Pedro спасибо, см. Мое редактирование. – RaviVadera

+0

'[\ d | \,]' также соответствует также и '[\ d | \,] {6}' соответствует только 6 цифрам. –

0
~[a-z]{2}[\d|\,]{6}[A-M] 

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

RegExr

Используйте его, как это в вашем коде:

Pattern pattern = Pattern.compile(yourPatternAsAString); 
Matcher matcher = pattern.matcher(yourInputToMatch); 
if(matcher.matches()) { 
    // gogogo 
} 
+1

Используйте Равис сообщение для правильного шаблона;) – cgew85

1

Что нужно знать о регулярных выражениях, так это то, что они являются семейством вещей, а не одной конкретной вещи. Есть довольно много разных, но похожих языков регулярных выражений, а поддерживающие их средства варьируются от языка программирования до языка программирования.

Вот образец регулярного выражения, которое будет работать в большинстве регулярных выражений языков в соответствии с вашими строками:

"^~[a-z][a-z]((,[0-9][0-9][0-9][0-9][0-9])|([0-9],[0-9][0-9][0-9][0-9])|([0-9][0-9],[0-9][0-9][0-9])|([0-9][0-9][0-9],[0-9][0-9])|([0-9][0-9][0-9][0-9],[0-9])|([0-9][0-9][0-9][0-9][0-9],))[A-HJ-M]$" 

«^» Якорем шаблона в начало строки, а «$» прикрепляет его конец, так что шаблон должен соответствовать всей строке, а не подстроке. Символы, заключенные в квадратные скобки, представляют собой «классы символов», соответствующие одному символу из множества, причем два символа разделены символом «-», представляющим диапазон символов. '|' разделяет альтернативы, а круглые скобки служат для группировки подшаблонов. Для некоторых двигателей с регулярным выражением скобки и символы «\» должны быть экранированы с помощью предшествующего символа «\», чтобы иметь эти особые значения, а не представлять себя.

Более функциональный язык регулярных выражений может позволить значительно упростить его; например:

"^~[a-z]{2}[0-9,]{6}(?<=[a-z][0-9]*,[0-9]*)[A-HJ-M]$" 

квантификаторов «{2}» и «{6}» обозначает, что предшествующий подшаблон должен точно соответствовать определенному количеству раз (вместо одного раза), а квантор «*» обозначает, что предыдущий подшаблон может соответствовать любому числу раз, включая ноль. Кроме того, «(? < = ...)» - это утверждение с обратной связью с нулевой длиной, которое проверяет, соответствуют ли предыдущие символы ввода указанному под-шаблону (в дополнение к тому, что уже соответствует предыдущему под-шаблону); символы также должны совпадать с последующим под-шаблоном (который их потребляет). «.» метасимвол и квант '*' поддерживаются почти во всех языках регулярных выражений, но утверждения и кванторы в фигурных скобках менее широко поддерживаются. Однако языки регулярного выражения Java и Perl будут понимать этот шаблон.

+0

Выражение позволит максимально возможное количество цифр. – RaviVadera

+0

@ RaviVadera, справедливо. Исправлено заменой содержимого утверждения и следующего подматрицы. –

+0

Большое спасибо за подробное объяснение регулярных выражений. Мне очень нравятся твои усилия, которые ты вложил в это. Это заставило меня понять регулярные выражения. – broesel001

1

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

System.out.println("~ak4,0000D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 
System.out.println("~fk,10000D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 
System.out.println("~jk400,00D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 
System.out.println("~ak4,0000D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 
System.out.println("~fk10000,D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 
System.out.println("~jk400,00I".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 
System.out.println("~ak40000,Z".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 
System.out.println("~fky,10000D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 
System.out.println("~,jk40000D".matches("~[a-z]{2}(?=\\d*,\\d*.$)[\\d,]{6}[A-HJ-M]")); 

Выход:

true 
true 
true 
true 
true 
false 
false 
false 
false 
+0

Для этого вам не нужно * надежное утверждение, но это, безусловно, удобно использовать. –

+0

вы могли бы дать ответ без поисковых запросов. –

+0

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

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