Как я могу узнать номер и их единицы? - PullRequest
1 голос
/ 05 августа 2020

я хочу создать регулярное выражение для «- любое число + единица измерения» в строке

например, у меня есть эта строка:

hello- world- 86 lo.  => 86 lo


in the -world- 6 lb   => 6 lb



and- the- dog -8kl     => 8kl

let data='in the world- 6 lo'

let  reg =  /-[0-9][a-z]/gi;
let matches = data.match(reg);
console.log(matches)

с его ответом:

let data='in the world- 6 lo'

    let  reg =  /-\s*([0-9]+\s*[a-z]+)/;
    let matches = data.match(reg);
    console.log(matches)

я получаю два ответа [«- 6 lo», «6 lo»]

я хочу получить только второй => «6 lo»

Ответы [ 4 ]

3 голосов
/ 05 августа 2020

Соответствует дефису и 0+ пробелам. Захват в группе 1 соответствует 1+ цифрам, необязательным пробельным символам и 1 или более символам az.

Спецификация c совпадает с необязательной десятичной частью, добавляя единицы:

-\s*([0-9]+(?:\.\d+)?(?:\s*(?:l[ob]|kl))?)\b

Демо Regex

const regex = /-\s*([0-9]+(?:\.\d+)?(?:\s*(?:l[ob]|kl))?)\b/g;
const str = `hello- world- 86 lo
in the -world- 6 lb
and- the- dog -8kl
hello- world- 86.6 lo
hello- world- 86`;

while ((m = regex.exec(str)) !== null) {
  console.log(m[1]);
}

Или более широкое соответствие:

-\s*([0-9]+(?:\.\d+)?(?:\s*[a-z]+)?)\b

Regex demo

const regex = /-\s*([0-9]+(?:\.\d+)?(?:\s*[a-z]+)?)\b/g;
const str = `hello- world- 86 lo
in the -world- 6 lb
and- the- dog -8kl
hello- world- 86.6 lo
hello- world- 86`;
let m;

while ((m = regex.exec(str)) !== null) {
  console.log(m[1]);
}
1 голос
/ 05 августа 2020

Что ж, ваши данные немного странные, особенно в последнем случае, когда кажется, что значение может быть отрицательным. Однако это регулярное выражение должно работать для описываемых вами случаев, и вы можете впоследствии повторно комбинировать части (знак, значение и единицу) любым способом.

let data1 = 'in the world- 6 lo'
let data2 = 'in the -world- 6 lb'
let data3 = 'and- the- dog -8kl'

let  reg = /- ?(-|\+)?(\d+\.?\d*) ?(\w+)/;

[data1, data2, data3].forEach(s => {
  console.log("Checking string:", s);
  const matches = s.match(reg);
  console.log("Sign:", matches[1] ?? "+");
  console.log("Value:", matches[2]);
  console.log("Unit:", matches[3]);
});

Обратите внимание, что я бы избегал использования глобального флага g, поскольку он не позволяет методу .match возвращать содержимое каждой группы захвата.

1 голос
/ 05 августа 2020

let data='in the world- 6 lo'

let  reg =  /\d+\s?[A-Za-z]{2}/gi;
let matches = data.match(reg);
console.log(matches)

попробуйте это, вы можете заменить [A-Za-z] на единственные необходимые вам единицы.

0 голосов
/ 05 августа 2020

Сопоставьте регулярное выражение, а затем сопоставьте массив результатов этого, чтобы избавиться от "-" в начале и вернуть его.
В регулярном выражении минус нужно было замаскировать, пробелы необязательно, устройство принимает все буквы. Если требуется, например, не более 2 букв, чем добавить {1,2}.
Поскольку вам нужны все результаты в строке (параметр g), я не могу использовать скобки в регулярном выражении. Поэтому мне пришлось сопоставить результаты и использовать здесь другое регулярное выражение, чтобы получить желаемую часть результатов.

function test(str) {
  let reg =  /\- ?[0-9]+ ?[a-z]+/gi;
  let result = str.match(reg);
  return result.map(res => {
    return res.match(/\- ?(.*)/)[1];
  });
}

console.log(test('hello- world- 86 lo, test-912 kg.'));
console.log(test('in the -world- 6 lb '));
console.log(test('and- the- dog -8kl'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...