¿Puede la expresión regular coincidir con un patrón solo si ese patrón aparece exactamente una vez?

Toma este ejemplo:

string1 = "aaxadfxasdf"

string2 = "asdfxadf"

string3 = "sadfas"

Necesito un patrón que coincida con x de modo que devuelva una coincidencia para x solo para string2.

Nota: para el propósito de esta pregunta, debo usar java regex. Además, no tengo acceso al código, por lo que no puedo simplemente verificar el número de coincidencias devueltas por el objeto java regex.


Hola todos,

Gracias por las respuestas, algunas de las cuales responden a mi pregunta. Mi ejemplo no era tan específico como necesitaba que fuera. Así que permítanme agregar esta peculiaridad a la mezcla:

¿Qué pasa si estoy haciendo coincidir más de un solo carácter?

string4 = "This is a sentence!"
string5 = "This is just another sentence with some repetition in it. This is a   sentence"
string6 = "this is"

En este caso, quiero hacer coincidir "oración" solo si aparece en la cadena solo una vez.

Además, aunque no está representado en el ejemplo, necesito poder buscar entre líneas.

preguntado el 03 de mayo de 12 a las 21:05

Para cadenas de 1 carácter como x es fácil: "^[^x]*(x)[^x]*$". -

4 Respuestas

^[a-wy-z]+x[a-wy-z]+$

No estoy seguro de si solo espera letras o si se pueden incluir símbolos y números antes y después de la x quieres emparejar. Si es así, utilice [^x] en lugar de [a-wy-z], al igual que:

^[^x]+x[^x]+$

Si también quieres emparejar x por sí mismo, reemplace el + símbolos con * al igual que:

^[a-wy-z]*x[a-wy-z]*$

contestado el 03 de mayo de 12 a las 21:05

@rsp El OP quiere "una coincidencia para x solo para string2". Eso no incluye "x" por sí mismo. Sin embargo, actualizaré mi respuesta con una advertencia. - tim pote

La forma en que leo la pregunta es que string2 es un ejemplo de 'x que aparece solo una vez' en la cadena y eso es lo que se preguntó: cómo hacer coincidir solo un x si aparece solo una vez en la cadena. Supongo que el OP realmente significaba algo x, que también cubre cadenas de caracteres múltiples como x. (No voté negativo por cierto.) - rsp

Hmmm, me pregunto si este es un caso de "votación negativa estratégica". Usted plantea un buen punto. Actualicé mi respuesta para tratar de dejar en claro cómo lograr exactamente lo que estás diciendo. - tim pote

^[^x]*x[^x]*$

donde el primer ^ es el comienzo de la línea ($ es el final), pero los otros ^ significan el complemento del conjunto de caracteres

contestado el 03 de mayo de 12 a las 23:05

¿Qué pasa si necesito buscar un documento completo, no solo una línea? - jason pared

luego elimina los caracteres de la línea de inicio y la línea final (^ y $), y agrega un indicador de "múltiples líneas" que creo que es (?i) al principio: (?i)[^x]*x[^x] * - ynka

Puede hacerlo con un autómata de estado finito, por lo tanto, seguramente puede hacerlo con una expresión regular.

(all the chars except x)*x(all the chars except x)*

contestado el 03 de mayo de 12 a las 21:05

Esto coincidiría con cualquier cadena rodeada por las palabras 'asdf' y 'adf' (es codicioso).

(?=asdf).+(?<=adf)

no codicioso:

(?=asdf)((?<!adf).)+(?<=adf)

con límites más estrictos:

^(?=asdf)((?<!adf).)+(?<=adf)$

contestado el 03 de mayo de 12 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.