То, что я пытаюсь выполнить:
Предполагая пример строки:
1 this is a1 my test 1a 12 string 12.123 whatever 1
Я хотел бы иметь регулярное выражение, которое дало бы мне все числа чисел (включая float), но я хочу, чтобы он пропустил число, если перед ним предшествует письмо (или, что более общее: не число). Таким образом, a1
и 1a
не совпадают.
Я боролся с этим некоторое время, я дошел до этого момента (не идеально, потому что он также ловит предыдущее пространство):
/(^|\s)\d*\.*\d+/g
Но это также поймает экземпляр 1a
... Я мог бы также создать что-то похожее, которое пропустит 1a
, но поймает a1
...
Могу ли я выполнить это с помощью сопоставления регулярных выражений?
Вы можете использовать границы слов с этим регулярным выражением:
/(?:\.\d+|\b\d+(?:\.\d+)?)\b/g
1.4e5
и ложно положительны для поплавков без промежутка между ними: regex101.com/r/9QEDH8/2
-1.23
например, -1.23
в не совпадают. Я могу с уверенностью ответить на этот вопрос, если у ОП есть какое-либо из этих требований.
Попробуйте это выражение: (?<=^|\s)[-+]?(?:[0-9]*\.[0-9]+|[0-9]+)(?=$|\s)
- Демо-версия Regex
Поддерживается JavaScript: (?:^|\s)([-+]?(?:[0-9]*\.[0-9]+|[0-9]+))(?=$|\s)
- Демо-версия Regex
Это выражение поддерживает числа с плавающей запятой с необязательным знаком.
JS не поддерживает положительный lookbehind, поэтому он был заменен группой, не захватывающей. Числа записываются 1-й группой.
Для простого, но не всеобъемлющего решения (предполагая числовые типы, используемые в данной строке примера, отрицательные числа, научную нотацию и т.д.), Попробуйте следующее:
\d*\.*\d+
Он удаляет \s
из вашего регулярного выражения, которое вы разработали, которое соответствует предыдущему пространству.
\d*
будет соответствовать всем номерам (цифры [0-9]).
Добавление \.*\d+
будет соответствовать поплавкам (десятичное число, а затем цифрам [0-9]).
Это не ответ только на регулярное выражение, но, может быть, это хорошо, посмотрим.
/^[-+]?(?:\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)
)
);
+1
или-1
? Экспоненциальная запись1e1
? значный сепаратор1,000,000.00
или1 000 000
?