1
votes

Remplacement par correspondance en Javascript

J'ai besoin de faire correspondre les nombres suivis d'une unité et de les remplacer par des chiffres + un trait de soulignement + une unité en utilisant Javascript.

J'ai sorti ce code, qui ne produit pas le résultat que je cherche à atteindre.

the street is 4.5 miles long
the budget was 430.000 dollars

Le code ci-dessus doit renvoyer "J'ai 3_billions de dollars" (mais il renvoie _b en ce qui concerne la substitution). Comme je suis nouveau avec Java, toute suggestion serait appréciée.

Modifier Déjà de nombreux conseils utiles! Voici quelques exemples supplémentaires:

var x = myFunction("I have 3 billion dollars");

function myFunction(text) {
return  text.replace(/(\d+\.?(?:\d{1,2})?) (\bmillion\b|\bbillion\b|\bbillion\b|\bmillions\b|\bbillions\b|\btrillion\b|\btrillions\b|\bmeter\b|\bmeters\b|\bmile\b|\bmiles\b|\%)/gi, function (match) {
          return "<span class='highlighted'>" + match[1] + "_" + match[2] + "</span>";
    });
 }


3 commentaires

Quelle est la variation de la chaîne d'entrée? pouvez-vous fournir plus d'échantillons ou serait-ce toujours quelque chose de similaire à chaîne numéro space unit chaîne ?


match dans la function (match) est la chaîne entière correspondante. Vous pouvez le faire avec function (match, group1, group2) et utiliser group1 et group2 au lieu de match [1] et correspondent [2] , mais vous n'avez vraiment pas besoin de la méthode anonyme, utilisez text.replace (your_regex, " $ 1_ $ 2 ")


Salut Randy, l'entrée est essentiellement un texte en cours d'exécution qui peut contenir des nombres (n'importe quel format) et un ensemble d'unités de mesure. Dans ce cas, j'étais plus intéressé par l'erreur de mon Javascrit et moins par la regex (que je devrais peut-être adapter). L'erreur étant que "match" n'était pas un tableau mais une chaîne, comme indiqué dans les réponses.


3 Réponses :


1
votes

match n'est pas un tableau mais une chaîne. Vous pouvez le diviser par '' rejoindre par _

var x = myFunction("I have 3 billion dollars");

function myFunction(text) {
return  text.replace(/(\d+\.?(?:\d{1,2})?) (\bmillion\b|\bbillion\b|\bbillion\b|\bmillions\b|\bbillions\b|\btrillion\b|\btrillions\b|\bmeter\b|\bmeters\b|\bmile\b|\bmiles\b|\%)/gi, function (match) {
          console.log(match)
          return "<span class='highlighted'>" +match.split(' ').join('_')+ "</span>";
    });
 }
console.log(x)


0 commentaires

1
votes

Nous pouvons utiliser str.replace avec votre expression d'origine, si cela fonctionne:

const regex = /(\d+\.?(?:\d{1,2})?) (\bmillions?\b|\bbillions?\b|\btrillions?\b|\bmeters?\b|\bmiles?\b|\%)/gm;
const str = `3 billion
3 million
3 %
2 meters`;
const subst = `<span class='highlighted'>" $1_$2 "</span>`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log(result);

Nous pouvons également simplifier légèrement notre expression:

(\d+\.?(?:\d{1,2})?) (\bmillions?\b|\bbillions?\b|\btrillions?\b|\bmeters?\b|\bmiles?\b|\%)

const regex = /(\d+\.?(?:\d{1,2})?) (\bmillion\b|\bbillion\b|\bbillion\b|\bmillions\b|\bbillions\b|\btrillion\b|\btrillions\b|\bmeter\b|\bmeters\b|\bmile\b|\bmiles\b|\%)/gm;
const str = `3 billion
3 million`;
const subst = `<span class='highlighted'>" $1_$2 "</span>`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

Démo

RegEx h3 >

Si cette expression n'était pas souhaitée et que vous souhaitez la modifier, veuillez consulter ce lien à l'adresse regex101.com .

Circuit RegEx

jex.im visualise les expressions régulières:

 entrez la description de l'image ici


1 commentaires

Toutes les réponses étaient bonnes, mais j'ai choisi celle-ci car très complète et informative.



2
votes

Exemple simple et plus clair pour vous

let regex = /\d+ (million|billion|millions|billions|trillion|trillions|meter|meters|mile|miles)/g

let match = "I have 3 billion dollars".match(regex)
let replace = match.map(x => x.split(" ").join("_"))

console.log(replace)


0 commentaires