Регулярные выражения: разница между "необязательным вхождением" и "нулем или более вхождением"

Я новичок в этих регулярных выражениях и не могу правильно понять значение необязательного вхождения и ноль или более вхождения (я использую регулярные выражения 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"]+
Другие вопросы по тегам