Регулярные выражения: разница между "необязательным вхождением" и "нулем или более вхождением"
Я новичок в этих регулярных выражениях и не могу правильно понять значение необязательного вхождения и ноль или более вхождения (я использую регулярные выражения JavaCC)
Например,
если мне нужно сопоставить имя, например, "файл", который также может содержать число, я могу использовать
["a"-"z"]*[0-9]?
но могу ли я использовать
["a"-"z"]*[0-9]*
соответствовать названию "файл", так как я использую "ноль или более вхождений" для чисел?
2 ответа
Необязательное вхождение может произойти ноль или один раз. Это использует ?
оператор.
*
Оператор возникновения может произойти ноль, один, два, ... раз
[@EdHeal ответ кратко отвечает на ваш вопрос. Мой ответ сосредоточен на попытках помочь вам достичь того, чего вы хотите.]
Что такое имя файла?
Любое число (включая 0) строчных английских букв, за которыми может следовать цифра:
["a"-"z"]* ["0"-"9"]?
Любое число (включая 0) строчных английских букв, за которыми следует любое число (включая 0) цифр:
["a"-"z"]* ["0"-"9"]*
Любое число (включая 0) строчных английских букв и до одной цифры в любом месте:
["a"-"z"]* ["0"-"9"]? ["a"-"z"]*
Любое число (включая 0) строчных английских букв или цифр:
["a"-"z","0"-"9"]*
Все вышеперечисленное будет соответствовать пустой строке, что может привести к бесконечному циклу.
Если вам требуется хотя бы один символ в имени файла, то выше будет соответственно
["a"-"z"]+ ["0"-"9"]? | ["0"-"9"]
["a"-"z"]* ["0"-"9"]+ | ["a"-"z"]+ ["0"-"9"]*
["a"-"z"]+ ["0"-"9"]? ["a"-"z"]* | ["a"-"z"]* ["0"-"9"] ["a"-"z"]* | ["a"-"z"]* ["0"-"9"]? ["a"-"z"]+
["a"-"z","0"-"9"]+