c# - online - expresiones regulares java
Expresiones de lĂmite de palabras Regex (4)
Aquí un código simple que te puede interesar:
string pattern = @"/b" + find + @"/b";
Regex.Replace(stringToSearch, pattern, replace, RegexOptions.IgnoreCase);
Código fuente: snip2code - C #: Reemplace una palabra exacta en una oración
Digamos, por ejemplo, que tengo la siguiente cadena "one two(three) (three) four five"
y quiero reemplazar "(three)"
por "(four)"
pero no dentro de las palabras. ¿Cómo lo haría?
Básicamente quiero hacer un reemplazo de expresiones regulares y terminar con la siguiente cadena:
"one two(three) (four) four five"
He intentado la siguiente expresión regular pero no funciona:
@"/b/(three/)/b"
Básicamente, estoy escribiendo un código de búsqueda y reemplazo y le doy al usuario las opciones habituales para hacer coincidir mayúsculas y minúsculas, una palabra completa, etc. En este caso, el usuario ha elegido una palabra completa pero no sé qué hará el texto que se busca ser.
Como dijo Gopi, pero (teóricamente) captura solo (three)
no two(three)
:
string input = "one two(three) (three) four five";
string output = input.Replace(" (three) ", " (four) ");
Cuando pruebo eso, obtengo: "one two(three) (four) four five"
Solo recuerda que los espacios en blanco son también un carácter de cadena, por lo que también se puede reemplazar. Si yo hiciera esto:
//use same input
string output = input.Replace(" ", ";");
Obtendría one;two(three);(three);four;five"
Recientemente me encontré con un problema similar en javascript que trataba de hacer coincidir los términos con un carácter ''$'' solo como palabras separadas, por ejemplo, si $ hot = ''FUZZ'', entonces:
"some $hot $hotel bird$hot pellets" ---> "some FUZZ $hotel bird$hot pellets"
La expresión regular //b/$hot/b/g
(mi primera suposición) no funcionó por la misma razón por la que los parens no coincidían en la pregunta original: como caracteres que no son palabras, no hay un límite de palabra / no palabra antes de ellos Con espacios en blanco o un inicio de cadena.
Sin embargo, la expresión regular //B/$hot/b/g
sí coincide, lo que muestra que las posiciones no marcadas en el excelente ejemplo de @ timwi coinciden con el término / B. Esto no fue intuitivo para mí porque ") ("
no está hecho de caracteres de palabras de expresiones regulares. Pero supongo que / B es una inversión de la clase / b, no tiene que ser caracteres de palabras, solo tiene que ser - no- caracteres de palabras :)
Su problema se debe a un malentendido de lo que realmente significa. Es cierto que no es obvio.
La razón por la que /b/(three/)/b
no coincide con los tres en su cadena de entrada es la siguiente:
-
/b
significa: el límite entre un carácter de palabra y un carácter que no es de palabra . - Las letras (por ejemplo, az) se consideran caracteres de palabras .
- Los signos de puntuación como
(
se consideran caracteres que no son palabras) .
Aquí está su cadena de entrada nuevamente, estirada un poco, y he marcado los lugares donde coincide /b
:
o n e t w o ( t h r e e ) ( t h r e e ) f o u r f i v e
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
Como puede ver aquí, hay una /b
entre "dos" y "(tres)", pero no antes del segundo "(tres)".
La moraleja de la historia? La "búsqueda de palabras completas" no tiene mucho sentido si lo que estás buscando no es solo una palabra (una cadena de letras). Ya que tiene caracteres de puntuación (paréntesis) en su cadena de búsqueda, no es como una "palabra". Si buscó una palabra que consistía solo en caracteres de palabras , entonces /b
haría lo que esperaba.
Por supuesto, puede usar un Regex diferente para que coincida con la cadena solo si está rodeado de espacios o si aparece al principio o al final de la cadena:
(^|/s)/(three/)(/s|$)
Sin embargo, el problema con esto es, por supuesto, que si busca "tres" (sin los paréntesis), no encontrará el que está en "(tres)" porque no tiene espacios alrededor, aunque En realidad es una palabra completa.
Creo que la mayoría de los editores de texto (incluido Visual Studio) usarán /b
solo si su cadena de búsqueda realmente comienza y / o termina con un carácter de palabra:
var pattern = Regex.Escape(searchString);
if (Regex.IsMatch(searchString, @"^/w"))
pattern = @"/b" + pattern;
if (Regex.IsMatch(searchString, @"/w$"))
pattern = pattern + @"/b";
De esa forma, encontrarán “(tres)” incluso si selecciona “solo palabras completas”.