2011-05-20 21 views
6

Necesito encontrar y reemplazar todas las apariciones de carácter de apóstrofo en una cadena, pero solo si este apóstrofo no es seguido por otro apóstrofo.Expresión regular: coincide solo con la aparición no repetida de un carácter

Eso es

abc'def

es un partido, pero

abc''def

no es una coincidencia.

Ya he compuesto un patrón de trabajo - (^|[^'])'($|[^']) pero creo que puede ser más corto y más simple.

Gracias,

Valery

+0

como esto ?? http://rubular.com/r/5oHGVS3r1c – diEcho

+0

¿Qué entorno es esto? Perl? Javascript? PHP? ¿Java? POSIX? No todas las sintaxis de expresiones regulares son iguales. –

Respuesta

9

depende de su entorno - si es compatible con su entorno de búsqueda hacia delante y de búsqueda hacia atrás, usted puede hacer esto: (?<!')'(?!')

Ref: http://www.regular-expressions.info/lookaround.html

+0

+1 hubiera sido mi respuesta también, fue demasiado lento ... – stema

+0

Gracias, esto es exactamente lo que estaba buscando. – ValeryC

2

Creo que su patrón es breve y preciso. Podría estar usando lookahead/lookbehind negativo, pero lo harían mucho más complejo. La capacidad de mantenimiento es importante.

+0

Sí, llevo usando regexp durante años y solo me tomé el tiempo para entender el futuro y mirar hacia atrás ayer, debido a una pregunta de stackoverflow. Probablemente dice más acerca de mí que la función, pero la conclusión es que la versión original es clara incluso cuando tiene un conocimiento más básico de la expresión regular, y es coherente en todos los entornos. – Tao

+0

@Tao: Eso es exactamente de lo que estoy hablando :) – jwueller

+0

Totalmente de acuerdo, mientras que el ejemplo anterior de lookahead/lookbehind es bueno, breve y correcto, mi propia versión primitiva es más fácil de entender para los desarrolladores no expertos en regex. Todavía está en duda qué enfoque utilizar :) – ValeryC

2

Vas a tener que tener cuidado para un número impar de apóstrofes:

abc'''def 

donde probablemente no desea reemplazar el 3 rd una y dejar la 1 st y 2 nd allí.

Puede hacerlo así (asumiendo que ya emparejado literales de cadena y sólo desea reemplazar el desigual apóstrofe detrás numerada):

Buscar el patrón:

(('')*)' 

y reemplazarlo con

$1 

que es el grupo 1: los apóstrofes pares (o no hay apóstrofes en absoluto).

No estoy seguro de cuál es el problema real que está resolviendo, pero en caso de que esté analizando/leyendo un archivo CSV, o una cadena que tenga la entrada de CSV, le recomiendo usar un analizador de CSV decente. Casi todos los idiomas los tienen de una forma u otra.

+0

No, esto no es CSV. En realidad estaba resolviendo un problema con la clase Java MessageFormat que traga un solo carácter de apóstrofo. – ValeryC

0

ver aquí nagative lookahed q(?!u)

  • (?=pattern) es un aspecto de la ventaja positiva afirmación
  • (?!pattern) es un preanálisis negativo afirmación
  • (?<=pattern) es una positiva afirmación mirada detrás
  • (?<!pattern) es una aserción de mirada negativa

http://www.regular-expressions.info/lookaround.html

working DEMO

+0

Refernec: http://www.perlmonks.org/?node_id=518444 – diEcho

+0

¿por qué downvoted? – diEcho

+0

Lo siento si hice algo mal. Estoy usando stackoverflow por primera vez. – ValeryC

Cuestiones relacionadas