Может ли кто-нибудь помочь мне с регулярным выражением? У меня есть строка с цифрами вроде:

X024123099XYAAXX99RR

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

Например, при тестировании эти входные данные должны возвращать ИСТИНА:

X024

X024123099X

X024123099XYA

X024123099XYAAXX99R

И эти должны вернуть FALSE:

XX024

X02412AA99X

X024123099XYAAXX9911

И так далее. Регулярное выражение должно проверять правильный синтаксис, начиная слева. У меня есть что-то подобное, но вроде не так:

 \w\d{0,12}\w{0,6}\d{0,2}\w{0,2}

Большое спасибо за любую помощь (я новичок в регулярных выражениях)

0
Rufnex 25 Авг 2011 в 13:05

2 ответа

Лучший ответ

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

^[A-Z](\d{0,9}$|\d{9}([A-Z]{0,6}$|[A-Z]{6}(\d{0,2}$|\d{2}([A-Z]{0,2}$))))

Это некрасиво, но насколько я могу судить, он кодирует ваши требования.

По сути, я взял каждый ящик чего-то вроде \d{9} и заменил его чем-то вроде (\d{0,9}$|\d{9}<rest of regex>).

Я добавил ^ и $, потому что в противном случае он будет соответствовать подстрокам в неверной строке. Например, он увидит недопустимую строку типа XX024 и сочтет, что это нормально, потому что она содержит X024.

1
Nick Knowlson 25 Авг 2011 в 21:36

Если я правильно вас понял, ваши строки должны соответствовать регулярному выражению

[A-Z]\d{9}[A-Z]{6}\d{2}[A-Z]{2}

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

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

static Pattern pattern = Pattern.compile( "[A-Z]\\d{9}[A-Z]{6}\\d{2}[A-Z]{2}" );
static Matcher matcher = pattern.matcher( "" );

public static void main(String[] args) {
  String[] strings = {
      "X024",
      "X024123099X",
      "X024123099XYA",
      "X024123099XYAAXX99R",
      "XX024",
      "X02412AA99X",
      "X024123099XYAAXX9911"
  };
  for ( String string : strings ) {
    out.format( "%s %s\n", string, inputOK(string) ? "OK" : "not OK" );
  }
}

static boolean inputOK(String input) {
  return matcher.reset(input).matches() || matcher.hitEnd();
}

Дает вывод:

X024 OK
X024123099X OK
X024123099XYA OK
X024123099XYAAXX99R OK
XX024 not OK
X02412AA99X not OK
X024123099XYAAXX9911 not OK
1
OpenSauce 25 Авг 2011 в 11:43