2012-05-30 17 views
11

¿Los grupos atómicos regex son distributivos?¿Los grupos atómicos regex son distributivos?

I.e. es (?>A?B?) siempre equivalente a (?>A?)(?>B?)?

De lo contrario, proporcione un ejemplo de contador.

+2

bien la última vez que tuve la tarea todavía no había internet, entonces no. – eyaler

+1

¿Son los signos de interrogación '?' Importantes para la pregunta? ¿Puedo reinterpretar la pregunta como "Is' (?> AB) 'siempre equivalente a' (?> A) (?> B)? '"? –

+0

creo que son importantes – eyaler

Respuesta

2

grupos atómicos en general

  1. El grupo atómico (?>regex1|regex2|regex3) toma sólo la primera persona compatible dentro de ella. En otras palabras, no permite retroceder.

  2. Las expresiones rectas se evalúan de izquierda a derecha, por lo que debe expresar el orden que desea que coincidan. El motor arranca en la primera posición, tratando de hacer una coincidencia exitosa, retrocediendo si es necesario. Si alguna ruta a través de la expresión llevaría a una coincidencia exitosa, entonces coincidirá en esa posición.

  3. Los grupos atómicos no son distributivos. Tenga en cuenta estos patrones evaluados en ABC: (?>(AB?))(?>(BC)) (sin coincidencias) y (?>(AB?)(BC)) (coincide con ABC).

grupos atómicos con todos los componentes opcionales

Pero, el escenario en el que ambas partes son opcionales pueden ser diferentes.

Considerando un grupo atómico con 2 piezas codiciosas opcionales A y B ((A)? y (B)?). En cualquier posición, si coincide A, puede continuar para evaluar el B opcional. De lo contrario, si A no coincide, está bien, también porque es opcional. Por lo tanto, (A)? coincide en cualquier posición. La misma lógica se aplica para el B opcional. La pregunta que queda es si puede haber alguna diferencia en el retroceso.

En el caso de todas las piezas opcionales ((?>A?B?)), dado que cada parte siempre coincide, no hay razón para retroceder dentro del grupo atómico, por lo que siempre coincidirá. Entonces, dado que está en un grupo atómico, está prohibido retroceder.

En el caso de grupos atómicos separados ((?>A?)(?>B?)), cada parte siempre coincide, y el motor tiene prohibido retroceder en cualquiera de los casos. Esto significa que los resultados serán los mismos.

Para reiterar, el motor solo puede usar la primera coincidencia posible en (?>A?)(?>B?), que siempre será la misma coincidencia que la primera coincidencia posible en (?>A?B?). Por lo tanto, si mi razonamiento es correcto, para este caso especial , las coincidencias serán iguales para múltiples grupos atómicos opcionales como un único grupo atómico con ambos componentes opcionales.

+0

de la respuesta de jpaugh, me doy cuenta de que "opcional" debería significar?, No * – eyaler

+1

@eyaler, sí, tienes razón. Quise decir '?' (La codiciosa repetición de 1 o cero) cuando dije opcional. –

1

Como no especificó, supongo que se está refiriendo a las expresiones regulares de Perl, ya que no he visto el operador de agrupación (?>) en ningún otro idioma.

considerar lo siguiente:

ra = 'A?' 
rb = 'B?' 

/(?>${ra} ${rb})/x es lo mismo que /(?>${ra})(?>${rb})/x.

En este caso, sí, funciona de cualquier manera; sin embargo, debido a que (?>) deshabilita el retroceso, este no es el caso con algunos otros valores de ra y rb.

Por ejemplo, teniendo en cuenta:

ra = 'A*' 
rb = 'AB*' 

/(?>${ra} ${rb})/x = /(?>${ra})(?>${rb})/x.

En este último, rb nunca podría coincidir, ya que ra consumiría una secuencia completa de A, y no permitiría retroceder. Tenga en cuenta que sería si usáramos (?:) como operador de agrupación. Tenga en cuenta también que si usamos los grupos de captura (), entonces la coincida con sería la misma, pero los efectos secundarios (asignación a \1, \2, ...) serían diferentes.

Cuestiones relacionadas