Может ли кто-нибудь помочь мне с регулярным выражением? У меня есть строка с цифрами вроде:
X024123099XYAAXX99RR
Мне нужно регулярное выражение, чтобы проверить, ввел ли пользователь правильную информацию. В правиле также должен быть запасной вариант, согласно которому ввод проверяется слева направо.
Например, при тестировании эти входные данные должны возвращать ИСТИНА:
X024
X024123099X
X024123099XYA
X024123099XYAAXX99R
И эти должны вернуть FALSE:
XX024
X02412AA99X
X024123099XYAAXX9911
И так далее. Регулярное выражение должно проверять правильный синтаксис, начиная слева. У меня есть что-то подобное, но вроде не так:
\w\d{0,12}\w{0,6}\d{0,2}\w{0,2}
Большое спасибо за любую помощь (я новичок в регулярных выражениях)
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
.
Если я правильно вас понял, ваши строки должны соответствовать регулярному выражению
[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
Похожие вопросы
Новые вопросы
regex
Регулярные выражения предоставляют декларативный язык для сопоставления шаблонов в строках. Они обычно используются для проверки, синтаксического анализа и преобразования строк. Поскольку регулярные выражения не полностью стандартизированы, все вопросы с этим тегом должны также включать тег, определяющий применимый язык программирования или инструмент.