2014-07-29 4 views
3

Указанные правила для струнных являютсяJava RegEx - специальный символ сезам конца строки

[Random Nr of Letters]##[Random Nr of Letters]#[Random Nr of Letters]########## 

Длина строки должна быть 35

Моя строка, например, выглядит

TEST##TESTING#TEST################# 

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

TEST##TESTING#TEST##A############## 

Мой метод:

private static boolean test(String test_line) { 
    String test = "[A-Z]{1,}##[A-Z]{1,}#[A-Z]{1,}#{1,}"; 
    Pattern test_pattern = Pattern.compile(test); 
    Matcher matcher = test_pattern.matcher(test_line); 
    return matcher.find(); 
} 

Существует простой метод с RegEx (я должен используйте его), как «завершите эту строку с помощью # и не разрешайте другие символы».

Другая проблема: Как я могу заверить, что мой тест не позволит другим символам, кроме A-Z 0-9 и #? Что-то вроде:

String test = "([^A-Z][^0-9][#])"; 
    Pattern test_pattern = Pattern.compile(test); 
    Matcher matcher = test_pattern.matcher(test_line); 
    return matcher.find(); 

(с переговоров)

Спасибо за помощь :)

+0

Вы имеете в виду это http://regex101.com/r/jV9lQ9/2? –

ответ

2

Позволяет делать это шаг за шагом:

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

^.{35}$ 

где

  • ^ представляет начало строки
  • . любой символ (рядом разделители строк)
  • {35} представляет сколько раз предыдущий элемент (в вне случае . - любой символ) может появиться, так что здесь регулярное выражение требует 35 символов
  • $ представляет конец строки

в вашем случае, если вы хотите принимать только символы в диапазоне A-Z и #, так что вы можете заменить . (любой символ) с этим character-class[A-Z#] так что ваше регулярное выражение может выглядеть

^[A-Z#]{35}$ 

Но вы также хотите обеспечить порядок этих символов. Другими словами, вы также хотите, чтобы проверить, если вся строка соответствует какой-то другой регулярное выражение

^[A-Z]{1,}##[A-Z]{1,}#[A-Z]{1,}#{1,}$ 

фактически вместо {1,} мы могли бы просто использовать +, который даст нам

^[A-Z]+##[A-Z]+#[A-Z]+#+$ 

Чтобы объединить эти два регулярных выражений, которые можно использовать look-ahead, который позволяет заглянуть в символы после позиции, где он был использован, и проверить, соответствуют ли символы после некоторого дополнительного регулярного выражения.

Так окончательное регулярное выражение может выглядеть

^(?=[A-Z#]{35}$)[A-Z]+##[A-Z]+#[A-Z]+#+$ 
    ----------- ------------------------ 
regex1 (length) regex2 (order) 

Теперь, чтобы избежать перекомпиляции (Pattern.compile(test)) то же самое регулярное выражение каждый раз, когда ваш метод называется он лучше хранить его скомпилированную версию вне метода в качестве поля классов ,Так что попробуйте, может быть что-то вроде

private static Pattern test_pattern = Pattern 
     .compile("^(?=[A-Z#]{35}$)[A-Z]+##[A-Z]+#[A-Z]+#+$"); 

private static boolean test(String test_line) { 
    return test_pattern.matcher(test_line).matches(); 
} 

Test

System.out.println(test("TEST##TESTING#TEST#################"));//true 
System.out.println(test("TEST##TESTING#TEST##A##############"));//false 
1

Попробовать это

[a-zA-Z]+#{2}[a-zA-Z]+#{1}[a-zA-Z]+#{1,} 

Или

^([a-zA-Z]+#{2}[a-zA-Z]+#{1}[a-zA-Z]+#{1,})$ 

Или

^(?=.{35}$)([A-Z]+#{2}[A-Z]+#{1}[A-Z]+#{1,})$ 

TEST##TESTING#TEST################# // pass 
TEST##TESTING#TEST##A############## // fail 

Demo

+0

'{1,}' эквивалентно просто '+' – nickb

+0

@nickb Спасибо, я знаю это :) Просто хотел сохранить ту же структуру. – hex494D49

+0

@ hex494D49 вход должен быть длиной 35 символов. –

1

Ниже регулярное выражение будет соответствовать линиям, которая удовлетворяет вышеуказанные критерии,

^(?=.{35}$)[A-Z0-9]+##[A-Z0-9]+#[A-Z0-9]+#+$ 

DEMO

Это соответствует строке, которая содержит ровно 35 символов.

+1

'{1,}' эквивалентно просто '+' – nickb

+0

обновлен .. и спасибо .. –

+0

@AvinashRaj +1 С тех пор ваш комментарий был за несколько секунд до моего ответа;) – hex494D49

0

Для формата, указанного обеспечения последнего символа является #:

([A-Z]+[#]+){3} 

Чтобы проверить длину строки:

if(test.length == 35) 
    // ... 

Чтобы проверить и разрешить цифр, а также (только буквенно-цифровые и # знак):

([A-Z0-9]+[#]+){3} 

Чтобы сделать строчные буквы а также:

(\w+#+){3} 
Смежные вопросы