J'ai ce regex que j'ai fait:

/\$([A-Za-z0-9\-\_ ]+)(\,?)/gi

J'ai besoin de convertir les phrases suivantes:

$a, $b, $c, $hi = "", $na

En cela:

$a = NULL, $b = NULL, $c = NULL, $hi = "", $na = NULL

Mais je reçois ceci au lieu de l'exemple ci-dessus:

$a = NULL, $b = NULL, $c = NULL, $hi = "", $na

J'utilise ceci pour remplacer les valeurs:

$$$1 = NULL$2

Comme vous pouvez le voir, s'il n'y a pas de virgule, cela ne fonctionnera pas.

J'espère que vous pourrez m'aider.

Mettre à jour: j'ai juste besoin de l'ignorer s'il a "=" et une valeur: Par exemple, je dois convertir ceci:

$a, $a, $a
$a, $a = '', $a
$a
$a,
$a = ''
$a = '',
$a = '', $a

Dans ce

$a = NULL, $a = NULL, $a = NULL
$a = NULL, $a = '', $a = NULL
$a = NULL
$a = NULL,
$a = ''
$a = '',
$a = '', $a = NULL

Le '' peut également être NULL, "" et des valeurs entières.

2
Ultraviolet 29 févr. 2020 à 22:53

2 réponses

Il semble que vous souhaitiez convertir cette chaîne:

"$a, $b, $c, $hi = \"\", $na"

Dans celui-ci:

"$a = NULL, $b = NULL, $c = NULL, $hi = \"\", $na = NULL"

Puisque ce dernier n'est qu'un littéral, vous n'avez pas besoin de code; il suffit d'écrire la deuxième chaîne. Je soupçonne cependant qu'il ne s'agit là que d'un exemple d'une question plus large et non formulée. Comment deviner quelle est la question à partir d'un seul exemple? Je vais faire une supposition, mais ce n'est qu'une supposition. Vous devez modifier votre question pour indiquer la question pour laquelle vous avez donné un exemple. Ma conjecture suit.

Les sous-chaînes à modifier commencent par un signe dollar suivi d'une ou plusieurs lettres minuscules suivies d'une virgule ou de la fin de la chaîne. Je souhaite remplacer chaque sous-chaîne à modifier, "$xx" par "$xx = NULL", où "xx" désigne toute chaîne d'une ou plusieurs lettres minuscules.

Les sous-chaînes à modifier peuvent être identifiées avec l'expression régulière

/\$[a-z]+(?=,|\z)/

(?=,|\z) est une anticipation positive qui nécessite que la correspondance soit suivie d'une virgule ou de la fin de la chaîne (\z).

Remarquez comment cette expression régulière découle facilement d'un énoncé précis de la question.

Je ne connais pas Javascript, mais dans Ruby la substitution pourrait se faire comme suit:

"$a, $b, $c, $hi = \"\", $na".gsub(/\$[a-z]+(?=,|\z)/) { |s| "#{s} = NULL" } 
  #=> "$a = NULL, $b = NULL, $c = NULL, $hi = \"\", $na = NULL"

Je suppose que cela peut être traduit assez facilement en Javascript.

0
Cary Swoveland 29 févr. 2020 à 20:34

Update 2

En fait, vous pouvez utiliser mon expression rationnelle d'origine, si vous le modifiez en utilisant les indicateurs appropriés:

/(?<=\$[A-Za-z0-9\-\_ ]+)(?=(?:,|$))/gmi

L'indicateur m indique ici $ de faire correspondre non seulement la fin absolue de la chaîne d'entrée (qui est la fin de vie de la dernière ligne), mais aussi la fin de chaque ligne, avec laquelle je pourrais faire correspondre \n dans la mise à jour précédente, où je n'avais pas utilisé l'indicateur m. (Le métacaractère ^ a un traitement similaire.)

Mise à jour

Étant donné qu'après un certain temps vous avez trouvé la nouvelle (que j'aurais dû m'attendre, en fait, c'est ma faute) que le fichier d'entrée est multiligne, vous avez besoin de la variation suivante, qui envisage une des trois choses possibles, {{X0} } et $, comme dans ma réponse d'origine, ainsi qu'un \n qui est un EOL, pour toutes les lignes sauf la dernière:

/(?<=\$[A-Za-z0-9\-\_ ]+)(?=(?:,|\n|$))/gi

Réponse originale

Vous pouvez utiliser l'expression régulière suivante pour détecter les positions où vous souhaitez insérer = NULL:

/(?<=\$[A-Za-z0-9\-\_ ]+)(?=(?:,|$))/gi

Comme j'ai utilisé un lookbehind et un lookahead pour trouver la position, toute l'expression régulière ne correspond en fait à aucun texte, mais juste à une position, vous n'avez donc pas besoin de faire référence à quoi que ce soit dans la substitution, qui ne doit être que {{X0} }. Vous pouvez le voir en action ici.

Plus en détail

  • (?<=regex) correspond à la position (une correspondance de longueur nulle) à la fin du texte correspondant à regex, donc dans l'exemple spécifique, il correspond juste après $a, $b, ...
  • (?=regex) correspond à la position au début du texte correspondant à regex, donc dans l'exemple spécifique, il correspond juste avant , ou $ (EOL), qui sont les deux alternatives séparées par |.
  • (?:…) n'est qu'une version non capturante de (…).
0
Enrico Maria De Angelis 29 févr. 2020 à 20:53