2013-09-26 4 views
0

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

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

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

/[^0-9.]/g 

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

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

вернет

43.24

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

+0

Возможно, мы можем лучше помочь в выполнении конкретной задачи, которую вы хотите выполнить, отрицая регулярное выражение? А также укажите язык программирования, который вы используете. – justhalf

+0

И какова ваша ожидаемая принятая строка? – justhalf

+0

@justhalf Я обновил вопрос для большей ясности относительно того, что я хочу выполнить – LJS

ответ

1

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

/[^0-9.]//g 

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

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

Выполнение этого действия даст вам 43.24 для обоих примеров.

+0

Это работает для меня, спасибо! – LJS

0

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

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

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

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

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

Разница между классами, указанными здесь и в ответ Винса в том, что я в том числе фильтрация ведущих 0s. Следует отметить, что в первой редакции Винса может появиться дополнительная «/» - но, возможно, у нее есть цель, которую я не поймал.

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

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

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

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

Это зависит от функциональности «негативный взгляд», которую поддерживает JavaScript в наши дни. Вы можете обратиться к нескольким проводкам stackoverflow для получения дополнительной информации (например, Regular Expressions and negating a whole character group), и есть несколько ресурсов, которые можно найти в Интернете, где обсуждаются «lookahead» и «lookbehind».

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

+0

Очень информативный, я узнал кое-что. Я новичок в регулярном выражении, поэтому я оценил ваши комментарии. Кстати, я на самом деле имел в виду, что регулярное выражение соответствует нулю, одному или двум десятичным знакам. Еще раз спасибо! – LJS

Смежные вопросы