Совпадение всех числовых вхождений без букв, следующих или предшествующих

1

То, что я пытаюсь выполнить:

Предполагая пример строки:

1 this is a1 my test 1a 12 string 12.123 whatever 1

Я хотел бы иметь регулярное выражение, которое дало бы мне все числа чисел (включая float), но я хочу, чтобы он пропустил число, если перед ним предшествует письмо (или, что более общее: не число). Таким образом, a1 и 1a не совпадают.

Я боролся с этим некоторое время, я дошел до этого момента (не идеально, потому что он также ловит предыдущее пространство):

/(^|\s)\d*\.*\d+/g

Но это также поймает экземпляр 1a... Я мог бы также создать что-то похожее, которое пропустит 1a, но поймает a1...

Могу ли я выполнить это с помощью сопоставления регулярных выражений?

  • 1
    Как насчет ... положительных и отрицательных чисел +1 или -1 ? Экспоненциальная запись 1e1 ? значный сепаратор 1,000,000.00 или 1 000 000 ?
  • 0
    Мне не нужны экспоненциальные обозначения для этого. Цифровой разделитель действительно будет отличным дополнением (за исключением пробелов, потому что в этом случае их следует рассматривать как отдельные числа).
Показать ещё 2 комментария
Теги:

4 ответа

1
Лучший ответ

Вы можете использовать границы слов с этим регулярным выражением:

/(?:\.\d+|\b\d+(?:\.\d+)?)\b/g

Демо-версия RegEx

  • 0
    «поплавки включены»: не соответствует 1.4e5 и ложно положительны для поплавков без промежутка между ними: regex101.com/r/9QEDH8/2
  • 0
    И вы можете включить числа со -1.23 например, -1.23 в не совпадают. Я могу с уверенностью ответить на этот вопрос, если у ОП есть какое-либо из этих требований.
Показать ещё 6 комментариев
0

Попробуйте это выражение: (?<=^|\s)[-+]?(?:[0-9]*\.[0-9]+|[0-9]+)(?=$|\s) - Демо-версия Regex

Поддерживается JavaScript: (?:^|\s)([-+]?(?:[0-9]*\.[0-9]+|[0-9]+))(?=$|\s) - Демо-версия Regex

Это выражение поддерживает числа с плавающей запятой с необязательным знаком.

JS не поддерживает положительный lookbehind, поэтому он был заменен группой, не захватывающей. Числа записываются 1-й группой.

0

Для простого, но не всеобъемлющего решения (предполагая числовые типы, используемые в данной строке примера, отрицательные числа, научную нотацию и т.д.), Попробуйте следующее:

\d*\.*\d+

Он удаляет \s из вашего регулярного выражения, которое вы разработали, которое соответствует предыдущему пространству.

\d* будет соответствовать всем номерам (цифры [0-9]).

Добавление \.*\d+ будет соответствовать поплавкам (десятичное число, а затем цифрам [0-9]).

0

Это не ответ только на регулярное выражение, но, может быть, это хорошо, посмотрим.

/^[-+]?(?:\d+(?:\.\d*)?|\d*\.\d+)(?:e\d+)?$/ выражение, используемое здесь, это //^[-+]?(?:\d+(?:\.\d*)?|\d*\.\d+)(?:e\d+)?$/ - /^[-+]?(?:\d+(?:\.\d*)?|\d*\.\d+)(?:e\d+)?$/:

var testStr = '.1 this is a1 my test +5 1a 12 string -2.4 12.123 whatever . .02e1 5e5.4 1 1.4e5 1.2.3';

console.log('matches');
console.log(...testStr
  .trim()
  .split(/\s+/g)
  .filter(word => /^[-+]?(?:\d+(?:\.\d*)?|\d*\.\d+)(?:e\d+)?$/
    .test(word)
  )
);

console.log('mismatches');
console.log(...testStr
  .trim()
  .split(/\s+/g)
  .filter(word => !/^[-+]?(?:\d+(?:\.\d*)?|\d*\.\d+)(?:e\d+)?$/
    .test(word)
  )
);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню