/ / PowerShell Regex - palabra con comodines y comas - regex, powershell

PowerShell Regex - palabra con comodines y comas - regex, powershell

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 № 1

los -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 +)