Мне нужно регулярное выражение Java - PullRequest
0 голосов
/ 08 апреля 2011

В настоящее время я использую следующее регулярное выражение:

^[a-zA-Z]{0,}(\\*?)?[a-zA-Z0-9]{0,}

чтобы проверить строку, начинающуюся с буквенного символа и заканчивающуюся буквенно-цифровыми символами и имеющую звездочку (*) в любом месте строки, но не более одного раза. Проблема здесь в том, что если заданная строка все еще проходит, если она начинается с числа, но не имеет *, что должно привести к ошибке. Как я могу переделать регулярное выражение, чтобы потерпеть неудачу в этом случае?

отл.

TE - pass

*TE - pass

TE* - pass

T*E - pass

*9TE - pass

*TE* - fail (multiple asterisk)

9E - fail (starts with number)

EDIT: Извините за позднее редактирование, но я также должен убедиться, что строка содержит 8 символов или меньше, могу ли я включить это в регулярное выражение? Или я должен просто проверить длину строки после проверки регулярного выражения?

Ответы [ 9 ]

4 голосов
/ 08 апреля 2011

Это проходит ваш пример:

"^([a-zA-Z]+\\*?|\\*)[a-zA-Z0-9]*$"

It says:
  start with: [a-zA-Z]+\\*? (a letter and maybe a star)
              | (or)
              \\* a single star
  and end with [a-zA-Z0-9]* (an alphanumeric character)

Код для проверки:

public static void main(final String[] args) {
    final Pattern p = Pattern.compile("^([a-zA-Z]+\\*?|\\*)\\w*$");

    System.out.println(p.matcher("TE").matches());
    System.out.println(p.matcher("*TE").matches());
    System.out.println(p.matcher("TE*").matches());
    System.out.println(p.matcher("T*E").matches());
    System.out.println(p.matcher("*9TE").matches());
    System.out.println(p.matcher("*TE*").matches());
    System.out.println(p.matcher("9E").matches());
}

За Stargazer, если вы разрешите алфавитно-цифровую, перед звездой, то используйте это:

^([a-zA-Z][a-zA-Z0-9]*\\*?|\\*)\\w*$
1 голос
/ 08 апреля 2011

Один из возможных способов - разделить на 2 условия:

^(?=[^*]*\*?[^*]*$)[a-zA-Z*][a-zA-Z0-9*]*$
  • Часть (?=[^*]*\*?[^*]*$) гарантирует, что в строке содержится не более одного *.
  • [a-zA-Z*][a-zA-Z0-9*]* part гарантирует, что он начинается с алфавита или *, за которым следуют только буквенные цифры или *.
0 голосов
/ 08 апреля 2011

Не более одной звездочки, буквенные символы в любом месте и цифры в любом месте, но в начале.

    String alpha = "[a-zA-Z]";
    String alnum = "[a-zA-Z0-9]";

    String asteriskNone = "^" + alpha + "+" + alnum + "*";
    String asteriskStart = "^\\*" + alnum + "*";
    String asteriskInside = "^" + alpha + "+" + alnum + "+\\*" + alnum + "*";
    String yourRegex = asteriskNone + "|" + asteriskStart + "|"
            + asteriskInside;
    String[] tests = {"TE","*TE","TE*","T*E","*9TE","*TE*", "9E"};
    for (String test : tests)
        System.out.println(test + " " + (test.matches(yourRegex)?"PASS":"FAIL"));
0 голосов
/ 08 апреля 2011

Это Python, для Java понадобится немного массажа:


>>> import re
>>> p = re.compile('^([a-z][^*]*[*]?[^*]*[a-z0-9]|[*][^*]*[a-z0-9]|[a-z][^*]*[*])$', re.I)
>>> for test in ['TE', '*TE', 'TE*', 'T*E', '*9TE', '*TE*', '9E']:
...  if p.match(test):
...   print test, 'pass'
...  else:
...   print test, 'fail'
... 
TE pass
*TE pass
TE* pass
T*E pass
*9TE pass
*TE* fail
9E fail

Надеюсь, я ничего не пропустил.

0 голосов
/ 08 апреля 2011

Это было непросто (понравилось испытание), но вот оно:

^(\*[a-zA-Z0-9]+|[a-zA-Z]+[\*]{1}[a-zA-Z]*)$

Чтобы соответствовать T9 * Z, как указано в другом посте со StarGazer712, мне пришлось изменитьэто:

^(\*[a-zA-Z0-9]+|[a-zA-Z]{1}[a-zA-Z0-9]*[\*]{1}[a-zA-Z0-9]*)$
0 голосов
/ 08 апреля 2011

^([a-zA-Z][a-zA-Z0-9]*\*|\*|[a-zA-Z])([a-zA-Z0-9])*$

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

0 голосов
/ 08 апреля 2011

Как насчет этого, легче читать:

boolean pass = input.replaceFirst("\\*", "").matches("^[a-zA-Z].*\\w$");

Если я правильно понял, вы хотите:

  1. Начните с буквенного символа
  2. Конец буквенно-цифровым символом
  3. Разрешить до одного * в любом месте
0 голосов
/ 08 апреля 2011

Найдите два возможных шаблона, один из которых начинается с *, а другой с альфа-символом:

^[a-zA-Z][a-zA-Z0-9]*(\\*?)?[a-zA-Z0-9]*|\*[a-zA-Z0-9]*
0 голосов
/ 08 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...