Замена на сопоставление в Javascript - PullRequest
1 голос
/ 08 июня 2019

Мне нужно сопоставить числа, за которыми следует единица, и заменить их цифрами + подчеркивание + единица измерения с помощью Javascript.

Я вышел с этим кодом, который не дает результата, которого я стремлюсь достичь.

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_ миллиарда долларов" (но он возвращает _b, если речь идет о замене). Поскольку я новичок в Java, любые предложения будут оценены.

Редактировать Уже много полезных советов! Вот еще несколько примеров импровизации:

the street is 4.5 miles long
the budget was 430.000 dollars

Ответы [ 3 ]

2 голосов
/ 08 июня 2019

Простой, более понятный пример для вас

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)
1 голос
/ 08 июня 2019

Мы можем использовать str.replace с вашим исходным выражением, если оно будет работать:

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+\.?(?:\d{1,2})?) (\bmillions?\b|\bbillions?\b|\btrillions?\b|\bmeters?\b|\bmiles?\b|\%)

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);

Демо

RegEx

Если это выражение нежелательно и вы хотите изменить его, перейдите по этой ссылке на regex101.com .

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

1 голос
/ 08 июня 2019

match не является массивом, это строка. Вы можете split это с помощью ' ' присоединиться к _

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)
...