Diferencia entre cuantificadores regex plus y estrella

Intento extraer el número de error de cadenas como "Wrong parameters - Error 1356" :

  Pattern p = Pattern.compile("(\\d*)"); Matcher m = p.matcher(myString); m.find(); System.out.println(m.group(1)); 

Y esto no imprime nada, que se volvió extraño para mí ya que * significa * - Matches the preceding element zero or more times desde Wiki

También fui a www.regexr.com y regex101.com y lo probé y el resultado fue el mismo, nada para esta expresión \d*

Luego empiezo a probar algunas cosas diferentes (todas las pruebas realizadas en los sitios que mencioné):

  • (\d)* no funciona
  • \d{0,} no funciona
  • [\d]* no funciona
  • [0-9]* no funciona
  • \d{4} funciona
  • \d+ funciona
  • (\d+) funciona
  • [0-9]+ funciona

Entonces, empiezo a buscar en la web si puedo encontrar una explicación para esto. Lo mejor que pude encontrar fue aquí en la sección Cuantificador, que dice:

 \d? Optional digit (one or none). \d* Eat as many digits as possible (but none if necessary) \d+ Eat as many digits as possible, but at least one. \d*? Eat as few digits as necessary (possibly none) to return a match. \d+? Eat as few digits as necessary (but at least one) to return a match. 

La pregunta

Como el inglés no es mi idioma principal, tengo problemas para entender la diferencia (principalmente la parte (but none if necessary) ). Entonces, ¿podrían ustedes, expertos en Regex, explicar esto en palabras simples, por favor?

Lo más cercano que encuentro a esta pregunta aquí en SO fue esta: Regex: cuantificador posesivo para el operador de repetición de estrellas, es decir, \ d ** pero aquí no se explica la diferencia.

El * cuantificador coincide con cero o más ocurrencias.

En la práctica, esto significa que

\d*

coincidirá con todas las entradas posibles , incluida la cadena vacía. Entonces su expresión regular coincide al comienzo de la cadena de entrada y devuelve la cadena vacía.

but none if necessary significa que no romperá el patrón de expresión regular si no hay coincidencia. Entonces \d* significa que coincidirá con zero or more occurrences de dígitos.

Por ej.

 \d*[az]* 

coincidirá

 abcdef 

pero \d+[az]*

no coincidirá

 abcdef 

porque \d+ implica que se requiere al menos un dígito.

 \d* Eat as many digits as possible (but none if necessary) 

\d* significa que coincide con un dígito cero o más veces. En su entrada, coincide con la menos posible (es decir, cero veces el dígito). Entonces no imprime ninguno.

 \d+ 

Coincide con un dígito una o más veces. Por lo tanto, debe encontrar y hacer coincidir un dígito o un dígito seguido de más dígitos.

Con el patrón / d +, se deberá alcanzar al menos un dígito, y luego la coincidencia devolverá todos los caracteres subsiguientes hasta que se scope un carácter que no sea un dígito.

/ d * coincidirá con todas las cadenas vacías (cero o más), también en la coincidencia. El analizador .Net Regex devolverá todos estos grupos de cadenas vacías en su conjunto de coincidencias.

Simplemente:

\ d * implica cero o más veces

\ d + significa una o más veces