1
votes

Regex pour supprimer tout ce qui n'est pas des mots numériques ou spécifiques

J'ai donc un créateur d'algorithme mathématique où l'utilisateur insère des variables à partir d'une liste de variables possibles et il peut créer un algorithme avec uniquement les variables et les nombres et caractères utilisés en mathématiques comme les parenthèses et autres. J'ai besoin d'une expression régulière qui supprimera de la chaîne tout ce qui n'est pas l'une de ces variables ou (). * - + / ou un nombre. J'ai essayé de nombreuses expressions régulières mais aucune n'a fait ce dont j'ai besoin toutes les variables doivent être entourées d'accolades.

Par exemple

var reg=new RegExp("^(?!{" + escapeString(variableNames.join("}|{")) + "}).*","g");
txt=txt.replace(reg,'');

Cela supprime tout simplement, et il n'y a pas d'exception pour les nombres et (). * - + /

Disons que j'ai la chaîne suivante:

{productPrice}827/100

Je dois tout supprimer sauf

var str='this is a string with a {productPrice} variable and some 827/100 math in it';

Voici mon code:

/^(?!{profitPercent}|{productPrice}|{weight}|{quantityInCart}|{lineTotal}|{cartTotal}|{billingUnits}|{test_111}|{test_213}|{test_prod_input_15}|{test_prod_input_16}).*/g

J'ai essayé de nombreuses expressions différentes, aucune d'elles n'a fonctionné.


0 commentaires

4 Réponses :


3
votes

Je vais le faire en sélectionnant la valeur souhaitée en utilisant la correspondance

let str = `var str='this is a string with a {productPrice} variable and some 827/100 math in it`

let op = str.match(/{[^}]+}|[\d)(.*+/]+/g)

console.log(op.join(''))
  • {[^}] +} - Correspond à { suivi de tout élément } .
  • | - Alternance.
  • [[\ d) (. * + /] +] - Correspond à chiffre, opérateurs, (,)

{[^}]+}|[\d)(.*+/]+


0 commentaires

0
votes

Cela peut être plus facile si vous divisez d'abord la chaîne, c'est-à-dire

const whitelist = new Set([
  '{profitPercent}',
  '{productPrice}',
  '{weight}',
  '{quantityInCart}',
  '{lineTotal}',
  '{cartTotal}',
  '{billingUnits}',
  '{test_111}',
  '{test_213}',
  '{test_prod_input_15}',
  '{test_prod_input_16}',
])

const regex = /[0-9.*\-+\/]/;
const str = 'this is a string with a {productPrice} variable and some 827/100 math in it'

const newStr = str.split(' ').filter((word) => {
  return whitelist.has(word) || regex.test(word)
}).join('')

console.log(newStr)

Je choisirais l'autre réponse si vous n'avez pas de liste blanche de variables et avez juste besoin de faire correspondre quoi que ce soit entre accolades


0 commentaires

0
votes

Peut être fait comme ça.

/.*? (?: ((?: {profitPercent} | {productPrice} | {weight} | {quantityInCart} | {lineTotal} | {cartTotal} | {billingUnits} | {test_111} | { test_213} | {test_prod_input_15} | {test_prod_input_16} | [- (). * + \ d \ /]) +) | $) / g

https://regex101.com/r/lHx4FE/1

Au lieu de supprimer ce que vous NE veux pas, supprimez tout sauf ce que vous FAITES .
L'interprétation positive est toujours meilleure.

Remplacez par $ 1 ce que vous voulez.

Développé

 .*? 
 (?:
      (                             # (1 start)
           (?:
                {profitPercent}
             |  {productPrice}
             |  {weight}
             |  {quantityInCart}
             |  {lineTotal}
             |  {cartTotal}
             |  {billingUnits}
             |  {test_111}
             |  {test_213}
             |  {test_prod_input_15}
             |  {test_prod_input_16}
             |  [-().*+\d/] 
           )+
      )                             # (1 end)
   |  
      $ 
 )


0 commentaires

0
votes

Au lieu d'affirmer le début de la chaîne ^ et d'utiliser les variables dans un recherche négative (?! vous pouvez les utiliser dans un groupe sans capture (?:

Ensuite, ajoutez les variables que vous voulez faire correspondre à une classe de caractères [(). * + / \ d] + et ajoutez-la au alternance .

Cela vous donnera les correspondances que vous souhaitez conserver, et vous pouvez utiliser join en utilisant une chaîne vide comme délimiteur pour les concaténer, ce qui donne:

{productPrice}827/100

Votre code (vous devez ajouter escapeString ) pourrait ressembler à:

p >

var variableNames = [
  "profitPercent",
  "productPrice",
  "weight",
  "quantityInCart",
  "lineTotal",
  "cartTotal",
  "billingUnits",
  "test_111",
  "test_213",
  "test_prod_input_15",
  "test_prod_input_16"
];

var str = 'this is a string with a {productPrice} variable and some 827/100 math in it';
var reg = new RegExp("(?:{" + variableNames.join("}|{") + "}|[\\d)(.*+/]+)", "g");
str = str.match(reg).join('');
console.log(str);


2 commentaires

merci cela a fonctionné. J'essaye maintenant d'appliquer le même regex en php en utilisant preg_replace pour faire la même chose que ça. j'utilise preg_replace ('/ (?: {'. implode ('} | {', array_column ($ vars, 'name'‌)).'} | [\\ d0-9'.preg_‌ quote ( imploser ('', $ ch‌ ars)). '\ /] +) /', '', $ a‌ lgo); mais il renvoie le texte que je ne veux pas. qu'est-ce que je fais de mal ici?


@SuzanneEdelman Vous utilisez preg_replace mais je pense que vous pourriez utiliser preg_match_all, par exemple 3v4l.org/9vfD7