2009-07-09 11 views
11

Regex.Pattern de Java soporta la siguiente clase de caracteres:¿Cuál es el punto detrás de las intersecciones de clases de caracteres en Regex de Java?

[a-z&&[def]] 

que coincide con "D, E o F" y que se llama una intersección.

Funcionalmente esto no es diferente de:

[def] 

que es más fácil de leer y entender en una gran RE. Entonces mi pregunta es, ¿de qué sirven las intersecciones, aparte de especificar un soporte completo para las operaciones de tipo CSG en las clases de caracteres?

(por favor, yo entiendo la utilidad de sustracciones como [a-z&&[^bc]] y [a-z&&[^m-p]], estoy pidiendo específicamente sobre las intersecciones según lo indicado supra.)

Respuesta

4

Aunque nunca he tenido la necesidad de hacerlo, me podría imaginar un uso con las clases de caracteres predefinidos que no son propias subconjuntos de cada uno (lo que hace que la intersección produzca algo diferente de las dos clases originales de caracteres). P.ej. a juego caracteres latinos solamente minúsculas:

[\p{Ll}&&\p{InBasicLatin}] 
+0

Quizás, pero el resultado de la RE anterior no es diferente de [\ p {Lower}], ya que \ p {Lower} por definición es solo letras minúsculas en su alfabeto predeterminado. Si su alfabeto predeterminado no es latino, ese RE de hecho no coincidirá con nada. – Christopher

+0

Cambió \ p {Lower} a \ p {Ll} para evitar el problema del alfabeto predeterminado. – iammichael

1

creo que en particular muestra es sólo una "prueba de concepto". Dos clases de caracteres intersecados solo coinciden con un personaje que coincide con los dos conjuntos de caracteres de forma individual. Las suscripciones que mencionas son las aplicaciones prácticas reales del operador.

En pocas palabras, no hay ningún significado oculto.

1

se puede construir una expresión regular coincidente entre dos conjuntos mediante programación:

String regex = String.format("[%s&&[%s]]", characterClass, whiteList); 
+0

Esto tiene algún sentido desde una perspectiva teórica, pero ¿cuál es un ejemplo práctico donde alguna vez usarías esto? – Christopher

+0

No tengo ningún ejemplo práctico en este momento :-( – dfa

1

Intersección es útil cuando la clase no es un subconjunto de otro conjunto. Hay muchas clases de caracteres predefinidas (se proporciona una lista parcial en el javadoc), en particular los diversos bloques de Unicode. Supongamos que hay un bloque definido para todos los caracteres utilizados en chino y uno para todos los caracteres utilizados en japonés. Hay una buena cantidad de superposición, pero no está completa en ninguno de los lados (no estoy seguro de si las clases de bloque Unicode reflejan esto). Si desea hacer coincidir solo los caracteres que aparecen en ambos idiomas, puede usar una intersección de los dos.

Cuestiones relacionadas