2009-04-24 7 views
14

Según entiendo, la implementación de Java de expresiones regulares se basa en Perl. Sin embargo, en el siguiente ejemplo, si ejecuto la misma expresión regular con la misma cadena, Java y Perl devuelven resultados diferentes.¿Por qué las expresiones regulares en Java y Perl actúan de manera diferente?

Aquí está el ejemplo de Java:

public class RegexTest { 
    public static void main(String args[]) { 
     String sentence = "This is a test of regular expressions."; 
     System.out.println(sentence.matches("\\w") ? "Matches" : "Doesn't match"); 
    } 
} 

Esto devuelve: no coincide con

Aquí está el ejemplo de Perl:

my $sentence = 'This is a test of regular expressions.'; 
print ($sentence =~ /\w/ ? "Matches" : "Doesn't match") . "\n"; 

Esto devuelve: Partidos

Para mí, el resultado de Perl tiene sentido. Busca una coincidencia para un personaje de una sola palabra. No entiendo por qué Java no lo considera un partido. ¿Cuál es el motivo de la diferencia?

Respuesta

31

El método Java matches está probando si la expresión regular coincide con el String completo. Para probar si se puede encontrar una expresión regular en cualquier lugar de una cadena, cree un Matcher y use su método find.

10

Además, la sintaxis de regex de Perl es NOT la sintaxis Java Regex.

No se aplica necesariamente en este caso, pero esta es una respuesta más a su pregunta más general.

Java tiene una sintaxis de expresión regular conocida como "PCRE", es decir, compatible con Perl.

Sin embargo, este nombre es muy engañoso, porque hay muy poco acerca de él que es realmente compatible con Perl.

Por ejemplo, las expresiones regulares Perl permiten ejecutar código en la propia expresión, y muchos otros operadores avanzados, y algunas sintaxis son diferentes en Perl ya que están en otros idiomas (es decir: muchos lenguajes usan \> y \< como límite de palabra marcadores, pero Perl simplemente usa '\ b')

Dedique unos minutos a leer algunos de los PerlRe Documentation y descubrirá muchos trucos asombrosos que el motor de expresiones regulares de Perl puede hacer que nada más parece hacer.

+2

PCRE era compatible con perl en los primeros días de Perl versión 5, o era perl v4. No es seguro. Mientras tanto, la expresión regular de Perl avanzó mucho. –

+0

+1 para responder la pregunta más general (la del título). Me gustaría agregar que el libro 'Mastering Regular Expressions' de Jeffrey Friedl es excelente para entender las similitudes y diferencias entre los sabores regex comunes. – Jonik

Cuestiones relacionadas