Estoy creando un proyecto que debe coincidir con un texto que está dentro de : text to match -. Por ejemplo, si tengo esta cadena:

nathanpc / ltweet: haciendo una pregunta en #StackOverflow: "Expresión regular para que coincida con un texto dentro: -" - @devs

Quiero hacer coincidir Asking a question at #StackOverflow: "Regular Expression To Match a Text Inside : -". Todo lo que está después del primer : y el último -, pero ¿cuál es la expresión regular correcta para hacer esto?

PD: estoy usando Javascript con jQuery

0
Nathan Campos 30 jun. 2011 a las 02:28

4 respuestas

La mejor respuesta

Si está utilizando expresiones regulares compatibles con Perl, como las que se encuentran en la mayoría de los idiomas:

/:(.*)-/

Es posible que no necesite las barras, dependiendo del idioma. El grupo de captura 1 obtendrá el contenido que desea.

.* es un juego codicioso, por lo que intentará hacer coincidir tantos caracteres como sea posible, hasta el último guión en la entrada.

2
Matt Ryall 29 jun. 2011 a las 22:36

Si utiliza un operador codicioso como ., intentará formar la mayor coincidencia posible (al menos en motores de expresión regular compatibles con Perl)

Entonces, para que coincida con esto, algo tan simple como :(.*)- funcionará.

Vea este script de ejemplo en Perl:

my $str = "Discard:Testing:- one two three -discard";
$str =~ m/:(.*)-/;
print $1;

$1 = "Testing:- one two three"

O en javascript aquí: http://www.regular-expressions.info/javascriptexample.html

1
Bayes 29 jun. 2011 a las 22:43

Las expresiones regulares "estándar" no pueden analizar este texto exactamente como lo describió. Ese análisis requiere algún contexto , que no se puede expresar con expresiones regulares. Por ejemplo, al recibir el primer "-", ¿cómo no termina la expresión?

Fuera de mi cabeza, solo puedo venir con expresiones regulares extendidas de Perl, que permiten el análisis de sub-expresiones, pero no será fácil, ya que tienes que contar las ocurrencias de ":" y "-" para que coincidan exactamente con el último uno.

0
Diego Sevilla 29 jun. 2011 a las 22:35

Esto funciona para mí (rubí):

[^:]+:\s+([^-]+.*?)\s-

Prueba:

 test = "nathanpc/ltweet: Asking a question at #StackOverflow: 'Regular Expression To Match a Text Inside : -' - @devs"

 m = test.match /[^:]+:\s+([^-]+.*?)\s-/

Entonces

 m[1].to_s

Produce

Asking a question at #StackOverflow: 'Regular Expression To Match a Text Inside : -'

Como otros han notado, el :(.*)- mucho más simple funciona igual. Quizás sin espacios :\s(.*)\s-

1
Emiliano Poggi 29 jun. 2011 a las 22:47