2009-04-04 19 views
8

Busco un ejemplo de aplicación de una expresión regular a una secuencia de E/S Java que no simplemente convierta la secuencia en una cadena ya que me gustaría conservar los datos binarios. La mayoría de los ejemplos en Internet se centran en los datos de texto ...Aplicar una expresión regular a Java I/O Stream

+1

¿Qué estás buscando hacer? ¿Rechazar datos que no coinciden con la expresión regular? ¿Y con qué quieres unir si no estás interesado en las cuerdas? Alguna aclaración sería buena –

+0

Solo por aclaración: una conversión a caracteres y volver a datos binarios puede tener un impacto en el rendimiento, pero no se perderá ni un solo byte debido a la conversión. – rwitzel

+0

posible duplicado de [Ejecución de expresiones regulares en una secuencia] (http://stackoverflow.com/questions/3013669/performing-regex-on-a-stream) –

Respuesta

0

Convierta la transmisión en una matriz de bytes.

+0

Se debe mencionar que esto solo tiene sentido si la entrada se puede cargar en la memoria en términos de su tamaño y el tiempo necesario para la carga! Eso significa que necesita saber la longitud de los datos proporcionados por la secuencia para escribir un programa confiable. ¡Conocer la longitud de entrada de una secuencia contradice su propósito de proporcionar datos potencialmente infinitos! –

-2

Las operaciones Regex se deben realizar en cadenas, que son bytes codificados de datos binarios. No puede realizar operaciones regex en bytes de datos, no tiene idea de lo que representan.

+8

-1 No estoy de acuerdo. No hay ninguna razón por la cual no pueda aplicar expresiones regulares a datos binarios. Los datos binarios no significan que no tienes idea de lo que representan. –

+0

Supuestamente, podría tomar una secuencia de 0 y 1 y realizar expresiones regulares sobre ella. Sin embargo, ninguna de las API Java existentes le da acceso a esa secuencia sin procesar sin convertirla en algo más significativo. –

+0

+1 de acuerdo, Aplicar una expresión regular en datos binarios no tiene sentido. Los Regexps están fundamentalmente orientados a cadenas, se definen mediante cadenas, por lo que siempre utilizarás una codificación de cadena, explícita o implícitamente. –

9

La funcionalidad necesaria no está presente en Java Standard. Tendrá que usar jakarta regexp, y específicamente, la clase StreamCharacterIterator. Esta clase encapsula un InputStream para su uso en operaciones de expresión regular.

Si desea utilizar el paquete de expresiones regulares estándar, sugeriría tomar un la fuente de la clase anterior here y cambiar el contrato mediante la implementación de CharSequence en lugar de CharacterIterator.

+1

Un problema con la implementación de CharSequence es que la interfaz requiere que la clase implemente 'public int length()'. Si está leyendo desde una transmisión, no sabrá la duración y no podrá devolver una respuesta al motor de expresiones regulares. – monkeysplayingpingpong

0

Intente usar Ragel - herramienta de expresión regular con devoluciones de llamadas de transiciones.

Se puede aplicar a las secuencias y trozos.

Cuestiones relacionadas