Regex para localizar SOMENTE uma string específica entre uma string e parantheses

1

Estou tentando substituir a sequência "Business Service Management" (sem as aspas), que vem entre "Assigned Workgroup" e ')'. Por exemplo:

project in (KISHORE_TEST, "Business Service Management") AND "Assigned Workgroup" in (KISHORE_TEST,"Business Service Management", "Account","BSM Automation") OR "Workgroup" in ("BSM Automation") OR "Assigned Workgroup" in ("Business Service Management","BSM Automation") OR "Assigned Workgroup" in ("BSM Automation") and team = "Business Service Management"

O regex deve corresponder APENAS:

  1. "Grupo de trabalho atribuído" em (KISHORE_TEST, "Business Service Management", "Conta", "BSM Automation")
  2. "Grupo de trabalho atribuído" em ("Business Service Management", "BSM Automation")

Todas as outras ocorrências de "Business Service Management" que não estão entre o padrão mencionado devem ser omitidas.

Acabei de apresentar (?<=Assigned Workgroup)(.*?)(\w*Business Service Management*\w)(.*?)\) , o que sei que está errado, mas sou novo no regex e não consigo encontrar o correto.

Posso solicitar sua ajuda aqui?

    
por Kishore Srinivasan 10.07.2018 / 09:19

2 respostas

1

Este faz o trabalho:

Assigned Workgroup.*?"\KBusiness Service Management(?="[^)]*\))

Explicação:

Assigned Workgroup              : literally
.*?                             : 0 or more any character, not greedy
"                               : a double quote
\K                              : forget all we have seen until this position
Business Service Management     : literally
(?=                             : positive lookahead
  "                             : a double quote
  [^)]*                         : 0 or more anyy character that is not a close parenthesis
  \)                            : a close parenthesis
)                               : end lookahead

Uso:

Usando o perl

my $str = <<EOD;
project in (KISHORE_TEST, "Business Service Management") AND "Assigned Workgroup" in (KISHORE_TEST,"Business Service Management", "Account","BSM Automation") OR "Workgroup" in ("BSM Automation") OR "Assigned Workgroup" in ("Business Service Management","BSM Automation") OR "Assigned Workgroup" in ("BSM Automation") and team = "Business Service Management"
EOD

$str =~ s/Assigned Workgroup.*?"\KBusiness Service Management(?="[^)]*\))/new_string/g;
say $str;

Saída:

project in (KISHORE_TEST, "Business Service Management") AND "Assigned Workgroup" in (KISHORE_TEST,"new_string", "Account","BSM Automation") OR "Workgroup" in ("BSM Automation") OR "Assigned Workgroup" in ("new_string","BSM Automation") OR "Assigned Workgroup" in ("BSM Automation") and team = "Business Service Management"

Isso funcionará com o php e com o Notepad ++ e com muitos idiomas / ferramentas que usam o sabor de regex do PCRE.

Se você tiver algumas dificuldades com o lookaround, você pode usar:

  • Localizar: (Assigned Workgroup.*?")Business Service Management("[^)]*\))
  • Substituir: $1new_string$2
por 10.07.2018 / 12:50
0

Esta não será a melhor solução, mas você pode querer experimentar isso

(?<="Assigned Workgroup" in \()["?\w"?|,]*\"(Business Service Management)

que você pode continuar a refinar em regex101 . Em seguida, você precisa usar ou $1 para fazer referência ao grupo de captura que contém Business Service Management para substituí-lo.

    
por 10.07.2018 / 11:38