2011-05-04 20 views
12

Necesito una expresión regular para que coincida con palabras completas que comienzan con $. ¿Cuál es la expresión y cómo puede probarse?

Ejemplo:

Esta palabra $ y esto se debe extraer $.

En la frase anterior, $word y $this se encontraría.

+0

Es curioso cómo 'expression' expresión regular es redundante ... :-) – Mehrdad

+2

definen "palabras completas ". – tchrist

+0

@tchrist una palabra completa es completa, a diferencia de una palabra parcial. – optikradio

Respuesta

12

Si desea hacer coincidir sólo palabras completas, es necesario el selector de carácter palabra

\B\$\w+ 

Esto corresponderá con un $ seguido de una o más letras, números o guión. Try it out on Rubular

+2

¿No es "no es" una palabra? ¿Qué tal "en punto"? ¿El "efecto secundario" es una palabra? Sí, sí y sí ¿Es "42" una palabra? Qué pasa "_____"? No y no. – tchrist

+0

Lo que utilicé fue la definición de expresiones regulares de una palabra, que no sorprendentemente tiene un atajo. Eso encaja con los ejemplos en la pregunta de z-buffer. Si él aclarara su definición de "palabra completa" como lo hizo, puedo modificar mi respuesta para que se ajuste. – edgerunner

+0

Acepto que la suya es la solución más natural en un contexto de programación. Simplemente no cumple con la definición de "palabra" que la mayoría de los usuarios de lenguaje natural usarían. Hay varios refinamientos que uno puede hacer en él, si uno conoce el lenguaje de programación objetivo. Por ejemplo, Java agrega '\ p {Currency_Symbol}' a sus caracteres permitidos; algunos usan '\ p {ID_Start} \ p {ID_Continue} *'; varios lenguajes admiten '::' como un separador entre nombre de clase e ident, etc. Pero sin saber lo que realmente quiso decir, es difícil hacerlo mejor, lo admito. La solución que cuestionó qué hacer con '$$ foo' también fue interesante. – tchrist

9
\$(\w+) 

Explicación:

\$: escapar de la especial $ carácter
(): captura coincide aquí (en la mayoría de los motores de por lo menos)
\w: partido a - z, A - Z y 0 - 9 (y _)
+: que coincida con y el número de veces que

1

Para la parte de las pruebas de que la pregunta te recomiendo utilizando http://myregexp.com/

+0

Bienvenido a Stackoverflow, Erikw. Por favor, si lo que quiere decir no es una respuesta directa a la pregunta, publique un comentario sobre la pregunta o una de las respuestas en su lugar. – edgerunner

+0

Estaba pensando en esto ya que acabo de notar los comentarios. Entonces, ¿una respuesta que aborda solo una parte de una pregunta es más adecuada como comentario? –

+0

Malo, acabo de notar la parte de "cómo se puede probar" en la pregunta. :) No, esto está bien tal como es. – edgerunner

0

Esto debe explicarse por sí mismo:

\$\p{Alphabetic}[\p{Alphabetic}\p{Dash}\p{Quotation_Mark}]*(?<!\p{Dash}) 

Aviso que no intenta igualar o dígitos los subrayados son otras cosas tontas que las palabras no tienen en ellos.

0

Trate esto como su expresión regular:

/ (\$\w+)/ 

\w+ significa "uno o más caracteres de palabra". Esto coincide con cualquier cosa que comience con $ seguido de los caracteres de las palabras, pero solo si va precedido de un espacio.

Se podría probarlo con Perl (el \ después de que el eco es sólo para romper la línea de tiempo):

> echo 'abc $def $ ghi $$jkl mnop' \ 
    | perl -ne 'while (/ (\$\w+)/g) {print "$1\n";} ' 
$def 

Si no se utiliza el espacio en la expresión regular, usted coincide con el $jkl en $$jkl - no estoy seguro si eso es lo que quiere:

> echo 'abc $def $ ghi $$jkl mnop' \ 
    | perl -ne 'while (/(\$\w+)/g) {print "$1\n";} ' 
$def 
$jkl 
2

creo que quieres algo como esto:

/(^\$|(?<=\s)\$\w+)/ 

Los primeros paréntesis solo capturan el resultado.

^\ $ coincide con el principio de toda la cadena seguida de un signo de dólar;

| te da una opción O;

(? < = \ s) \ $ es una mirada positiva detrás que comprueba si hay un signo de dólar \ $ con un espacio \ s detrás de él.

Finalmente, (para recapitular) si tenemos una cadena que comienza con un $ o un $ está precedida por un espacio, la expresión regular verifica si uno o más caracteres de palabra siguen - \ w +.

Esto coincidiría:

$test one two three 

y

one two three $test one two three 

pero no

one two three$test 
Cuestiones relacionadas