Pregunta

Me gustaría especificar un delimitador para un escáner que se divide en un cierto patrón, pero no quita que el patrón de las fichas. Me parece que no puede hacer este trabajo, como cualquier cosa que se identifica por la expresión regular también se come como parte del delimitador. ¿Alguna sugerencia?

Mi problema específico, no tengo el archivo que se parece a:

text/numbers mix
numbers
numbers
text/numbers mix
numbers
numbers
numbers
.
.

Me gustaría dividir a cabo a partir del texto / mezcla de los números + filas hasta el siguiente texto / mezcla de números. Tengo la expresión regular para identificarlos, pero como se ha dicho, que el uso como delimitador come parte de lo que quiero.

EDIT: Además código:

static final String labelRegex="\\s*[^01\\s*]\\w+\\s*";
static final Pattern labelPattern = Pattern.compile(labelRegex, Pattern.MULTILINE);

es el modelo que utiliza para identificar el bit de texto / números (sé que mis números de filas contienen todos los 1 / 0s separadas por espacios).

Cuando inicializar el escáner:

stateScan = new Scanner(new BufferedReader(new FileReader(source)));
stateScan.useDelimiter(labelPattern);

que se alimenta de las etiquetas, y simplemente deja las filas. Actualmente tengo una aplicación de trabajo que se inicia dos escáneres en dos lectores de archivos almacenados temporalmente de la misma fuente, una división de los estados y el otro por las etiquetas. Realmente me gustaría que fuera un solo agarrando la etiqueta + Estado.

¿Fue útil?

Solución

Puede utilizar un aspecto positivo adelante en su expresión regular. Buscar aheads (y traseros) no se incluyen en el partido, por lo que no serán "comidos" por el escáner. Esta expresión regular probablemente hará lo que quiere:

(?=text/numbers)

El delimitador será la cadena vacía justo antes de la text/numbers sub-cadena.

Aquí hay una pequeña demostración:

public class Main {
    public static void main(String[] args) {
        String text = "text/numbers mix\n"+
                "numbers\n"+
                "numbers\n"+
                "text/numbers mix\n"+
                "numbers\n"+
                "numbers\n"+
                "numbers";
        String regex = "(?=text/numbers)";
        Scanner scan = new Scanner(text).useDelimiter(regex);
        while(scan.hasNext()) {
            System.out.println("------------------------");
            System.out.println(">"+scan.next().trim()+"<");
        }
    }
}

que produce:

------------------------
>text/numbers mix
numbers
numbers<
------------------------
>text/numbers mix
numbers
numbers
numbers<
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top