Tratar de hacer un reemplazo en lo que entiendo que es una operación simple pero golpear una pared.
Puedo reemplazar una palabra con una coma al final:
$firstval = "ssonp,RDPNP,LanmanWorkstation,webclient,MfeEpePcNP,PRNetworkProvider"
($firstval) -replace "webclient+,",""
ssonp, RDPNP, LanmanWorkstation, MfeEpePcNP, PRNetworkProvider
Pero no he podido averiguar cómo agregar un comodín en la palabra, o cómo tengo varias palabras con comodines que proceden con una coma, por ejemplo:
w * cliente +, * tarifa *, etc.
(espacios agregados para dejar de ser interpretados como formato dentro de la pregunta)
Jugó con algunas permeaciones e intentó usar ejemplos de otras preguntas sin suerte.
Respuestas
2 para la respuesta № 1los -replace
El operador toma una expresión regular como su primer parámetro. Parece que estás confundiendo comodines y expresiones regulares. Tu patrón w*client+,*fee*,
, aunque una expresión regular válida, parece estar destinada a usar comodines.
La expresión regular equivalente de la *
comodín es .*
, dónde .
significa "cualquier personaje" y *
significa "0 o más ocurrencias". Por lo tanto, la expresión regular equivalente de w*client,
sería w.*client,
, y, de manera similar, la expresión regular equivalente de *fee*,
sería .*fee.*,
. Sin embargo, dado que la cadena a buscar tiene valores separados por comas, no queremos que nuestros patrones incluyan "cualquier carácter" (.*
) sino más bien "cualquier carácter menos coma" ([^,]*
). Por lo tanto, los patrones a utilizar se convierten en w[^,]*client,
y [^,]*fee[^,]*,
, respectivamente.
Para buscar ambas palabras en una cadena, separe los dos patrones con |
. Lo siguiente construye un patrón de este tipo y lo compara contra cadenas con una coincidencia en varias ubicaciones:
# Match w*client or *fee*
$wordPattern = "w[^,]*client|[^,]*fee[^,]*";
# Match $wordPattern and at most one comma before or after
$wordWithAdjacentCommaPattern = "({0}),?|,({0})$" -f $wordPattern;
"`$wordWithAdjacentCommaPattern: $wordWithAdjacentCommaPattern";
# Replace single value
"webclient", `
# Replace first value
"webclient,middle,last", `
# Replace middle value
"first,webclient,last", `
# Replace last value
"first,middle,webclient" `
| ForEach-Object -Process { ""{0}" => "{1}"" -f $_, ($_ -replace $wordWithAdjacentCommaPattern); };
Esto da como resultado lo siguiente:
$wordWithAdjacentCommaPattern: (w[^,]*client|[^,]*fee[^,]*),?|,(w[^,]*client|[^,]*fee[^,]*)$
"webclient" => ""
"webclient,middle,last" => "middle,last"
"first,webclient,last" => "first,last"
"first,middle,webclient" => "first,middle"
Una alternativa no regex que podría considerar seríaPara dividir la cadena de entrada en valores individuales, filtre los valores que coincidan con ciertos comodines y vuelva a ensamblar lo que queda en valores separados por comas:
(
"ssonp,RDPNP,LanmanWorkstation,webclient,MfeEpePcNP,PRNetworkProvider" -split ",", -1, "SimpleMatch" `
| Where-Object { $_ -notlike "w*client" -and $_ -notlike "*fee*"; } `
) -join ",";
Por cierto, usaste la expresión regular webclient+,
para emparejar y eliminar el texto webclient,
de su cadena (se parece a la HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNetworkProviderOrderProviderOrder
valor de registro). Solo una nota que, con el +
, que buscará el texto literal webclien
seguido de 1 o más apariciones de t
seguido por el texto literal ,
. Por lo tanto, que coincidirá webclientt,
, webclienttt,
, webclientttttttttt,
, etc. también webclient,
. Si solo estas interesado en emparejar webclient,
entonces puedes usar el patrón webclient,
(no +
)