Estaba practicando expresiones regulares y encontré algo intrigante
por una cadena
"world9 a9$ b6$" mi expresión regular "^(?=.*[\\d])(?=\\S+\\$).{2,}$"
devolverá falso ya que hay un espacio en el medio antes de que la mirada hacia adelante encuentre el signo $ con al menos un dígito y un carácter sin espacio.
En su conjunto, la cadena no coincide con el patrón.
¿Cuál debería ser la expresión regular si quiero devolver verdadero incluso si una subcadena sigue un patrón? como en este, a9$ y b6$ siguen la expresión regular.
Puedes usar
^(?=\D*\d)(?=.*\S\$).{2,}$ Vea la demostración de expresiones regulares . Como menciona el cuarto pájaro , dado que \S\$ coincide con dos caracteres, simplemente puede mover el patrón a la parte de consumo y usar ^(?=\D*\d).*\S\$.*$ , vea esto demostración de expresiones regulares .
Detalles
^ - inicio de cadena (implícito si se usa en .matches() )(?=\D*\d) - una anticipación positiva que requiere cero o más caracteres que no sean dígitos seguidos de un carácter de dígito inmediatamente a la derecha de la ubicación actual(?=.*\S\$) : una anticipación positiva que requiere cero o más caracteres que no sean caracteres de salto de línea, tantos como sea posible, seguido de un carácter que no sea un espacio en blanco y un carácter $ inmediatamente a la derecha de la ubicación actual.{2,} : dos o más caracteres que no sean caracteres de salto de línea, tantos como sea posible$ - final de cadena (implícito si se usa en .matches() )En su mayoría, elimine los bits ^ y $ , ya que obligan a esto a una coincidencia de cadena completa, y desea coincidencias de subcadena. En general, mirar hacia adelante parece un error aquí, ¿qué está tratando de lograr al usar eso? (En general, rara vez se necesita mirar hacia adelante/mirar hacia atrás). Todo lo que necesitas es:
Pattern.compile("\\S+\\$"); posiblemente, si desea que un elemento (como a9$ ) se sostenga por sí solo, use \b , que es expresión regular para salto de palabra: básicamente, espacios en blanco (y algunos otros caracteres, como guiones bajos. los caracteres de dígitos se consideran un descanso Piense [^a-zA-Z0-9] ) - pero \b también coincide con el inicio/final de la entrada. Por lo tanto:
Pattern.compile("\\b\\S+\\$\\b") aún coincide foo a9$ bar , o bien a9$ .
Si DEBE poner esto en términos de una coincidencia completa, por ejemplo, porque se ejecuta matches() (que siempre hace una coincidencia de cadena completa) y no puede cambiar eso, bueno, coloque ^.* delante y .*$ al final. atrás, tan simple como eso.
Absolutamente nada sobre esto dice "Esto solo se puede necesitar con anticipación".