Отрицательное регулярное выражение для цены

У меня есть регулярное выражение для сопоставления цены, где десятичные дроби необязательны, например,

/[0-9]+(\.[0-9]{1,2})?/

Теперь я хотел бы получить обратное выражение, но у меня возникли проблемы с этим. Я придумал что-то простое, как,

/[^0-9.]/g

Но это позволяет использовать несколько символов "." символы и более 2 цифр после запятой. Я использую функцию замены jQuery на размытие, чтобы исправить поле входной цены. Так что, если пользователь вводит что-то вроде,

"S $ 4sd3.24151. X45 бла бла текст бла" или "!#%!$43.24.234asdf бла бла текст бла"

это вернется

43,24

Кто-нибудь может предложить какие-либо предложения для этого?

2 ответа

Решение

Я бы сделал это в два этапа. Сначала удалите любой нецифровый и не точечный символ без нуля.

/[^0-9.]//g

Это даст 43.24151.45 а также 43.24.234 для первого и второго примера соответственно. Затем вы можете использовать свое первое регулярное выражение для сопоставления с первым появлением действительной цены.

/\d(\.\d{1,2})?/

Это даст вам 43.24 для обоих примеров.

Я предполагаю, что в программировании не всегда понятно, что означает "обратное".

Чтобы предложить решение исключительно на основе представленного вами примера, я приведу пример, очень похожий на тот, что представил Винс. У меня возникают трудности при составлении регулярного выражения, которое совпадает с нужным вам шаблоном и захватывает потенциально произвольное количество цифр с помощью повторяющихся групп захвата. И я не уверен, будет ли это выполнимо каким-то разумным способом (возможно, кто-то еще). Но двухэтапный подход должен быть простым.

Отметим, что я подозреваю, что вы ссылаетесь на функцию JavaScript JavaScript replace, которая является членом объекта String, а не на функции jQuery replaceWith и replaceAll, ссылаясь на "функцию замены jQuery". Последние являются функциями Dom Domulation. Но поправьте меня, если я неправильно понял.

В качестве примера, основываясь на некотором гипотетическом входе, вы можете использовать

<b>var numeric_raw = jQuery('input.textbox').attr ('value').replace (/[^0-9.]/g, "")</b>

удалить все символы из значения, введенного в текстовое поле, которые не являются цифрами или точками; тогда вы могли бы использовать

<b>var numeric_str = numeric_raw.replace (/^[0]*(\d+\.\d{1,2}).*$/, "$1")</b>

Разница между классами, указанными здесь и в ответе Винса, в том, что я включаю фильтрацию для ведущих нулей. Отметим, что в первом экземпляре Винса может быть дополнительный символ "/", но, возможно, у него есть цель, которую я не уловил.

Что касается "обратного", то один из способов понять ваш первоначальный запрос состоит в том, что вы ищете выражение, которое противоположно тому, которое вы предоставили. Отметим, что, хотя указанное вами выражение (/[0-9]+(.[0-9]]1,2‹)?/) соответствует целым и десятичным числам с двумя дробными цифрами, оно также соответствует любой единственной цифре - таким образом, он может идентифицировать совпадение, где его нельзя было бы предвидеть, для данной входной строки. Выражение не имеет якорей ('^', '$') и поэтому может допускать несколько возможных совпадений. Например, в строке "1.111" и "1.11", и "1" соответствуют указанному вами шаблону.

Мне кажется, что один шаблон, который соответствует любой строке, которая не соответствует вашему шаблону, является следующим, или, по крайней мере, делает это в большинстве случаев так:

/^(?:(?!.*[0-9]+(\.[0-9]{1,2})?).*)*$/

- если кто-то может определить точно "обратный" паттерн, пожалуйста, не стесняйтесь - у меня возникли проблемы с пониманием того, как предвидения интерпретируются по крайней мере для некоторых нюансов.

Это опирается на функциональность "негативного взгляда", которую поддерживает JavaScript в наши дни. Вы можете обратиться к нескольким публикациям в стеке потока для получения дополнительной информации (например, регулярные выражения и отрицание целой группы символов), и в Интернете можно найти несколько ресурсов, которые обсуждают "lookahead" и "lookbehind".

Я предполагаю, что этот ответ несет некоторую избыточность по отношению к тому, который уже был дан - я мог бы прокомментировать пост Оригинального постера или ответ Винса (вместо того, чтобы писать хотя бы часть моего ответа), но я пока не могу комментировать!

Другие вопросы по тегам