2011-06-04 18 views
5

Supongamos que tengo una subcadena BB que puede estar sola o ser parte de una cadena más larga, p. Ej. BB o AA | BB | CC o BB | CC o AA | BB, es decir, si sigue/es seguido por otra subcadena, DEBE estar separada por un |. ¿Qué expresiones regulares necesito para encontrar BB en cualquiera de los anteriores pero no en decir AABB?regex para buscar la subcadena

+0

¿Está tratando de encontrar si una cadena contiene | BB | pero no AABB, o es suficiente la cadena para contener | BB | ignorando el resto? O bien, quiere corregir las posiciones de todos | BB | en una sola cuerda? –

+0

No lo entiendo ¿Desea encontrar aquellos que son seguidos por '|' o aquellos que no son seguidos por '|' – Kaj

+0

asegúrate de aceptar una respuesta si hay una buena. No es necesario que sea mío, pero, en general, debe aceptar las respuestas si las ha respondido a su satisfacción. –

Respuesta

6

creo que esto lo hará:

^(.+[|])?BB([|].+)?$ 

Y después de probar here voy a decir que sí, eso es todo.

+0

si ese último '?' Estuviera presente ya que siempre quiere | CC después del BB –

+0

. En realidad, yo también pensé en eso. Sin embargo, la pregunta SÓLO dice que 'BB' tiene que tener' | 'en cada lado. No dice nada sobre OTRAS cadenas. Entonces, lo único que me importa es que es 'BLAHBLAHBLAH | BB | BLAHBLAHBLAH'. –

+0

¿Por qué el '[|]'? Simplemente use '\ |' – Eric

4

Si sus subseries se limitan a caracteres alfanuméricos, que ca usa:

\bBB\b 

si no, se puede simular la misma utilizando lookarounds:

(?<=\||^)BB(?=\||$) 

Su subcadena debe ser antes y después de una tubería, o cerca de los bordes.

+0

"Si sus subcadenas están limitadas a caracteres alfanuméricos ..." - * ASCII * alfanuméricos, es decir. Pero creo que el enfoque alternativo es más correcto de todos modos. Mira mi variación, sin embargo. No es mejor que el tuyo, solo un ejercicio de expansión mental. ;) –

0

No sé si es la posición que desea, pero esta captura donde BB comienza y termina, si BB es seguido por '|' o extremos de la cadena:

String data = "AA|BB|CCBBCC|BB"; 
Matcher m = Pattern.compile("(BB)(?:\\||$)").matcher(data); 
while (m.find()) { 
    System.out.println(m.group(1) + " starts at " + m.start() + " ends at " + m.end(1)); 
} 
+0

Debe sellar la parte delantera y la trasera. Tal como están las cosas, su expresión regular coincidirá con las dos últimas 'B' en' BBB', 'ABB',' BBB | CC', etc., y no creo que OP quiera eso. –

+0

No estoy seguro de lo que el OP realmente quiere, pero no ha dicho nada sobre si 'BB' en' ABB | 'debe coincidir o no.(Sí, mi expresión lo trata como una coincidencia) – Kaj

3

Aquí hay otra opción:

Pattern p = Pattern.compile("(?<![^|])BB(?![^|])"); 

String[] input = { "AABB", "BB", "AA|BB|CC", "BB|CC", "AA|BBB", "BBB|AA" }; 
for (String s : input) 
{ 
    Matcher m = p.matcher(s); 
    System.out.printf("%-10s : %b%n", s, m.find()); 
} 

de salida:

AABB  : false 
BB   : true 
AA|BB|CC : true 
BB|CC  : true 
AA|BBB  : false 
BBB|AA  : false 

Este es efectivamente el mismo que @ respuesta de Kobi, pero donde él está diciendo la BB es precedido/seguido de una tubería o el principio/final de la cadena, estoy haciendo la afirmación equivalente de que NO está precedido/seguido de un carácter que NO es una tubería.

+0

Extraño. Siempre cambio las miradas que marcan el inicio/final de la cadena al estilo opuesto, pero no pude hacer que funcione. (¡Oh, tuve '[^ |]' coincidir con líneas nuevas!) – Kobi

+0

Sí, esto también funciona. Gracias – user580459

Cuestiones relacionadas