2013-09-05 2 views
0

Здравствуйте, я пытаюсь создать регулярное выражение, которое распознает введенные деньги и числа. Я должен разрешать числа, потому что я ожидаю, что неформатные номера будут введены программно, а затем я отформатирую их самостоятельно. По какой-то причине мое регулярное выражение позволяет использовать символ одной буквы как возможный вход.regex позволяет одному персонажу (не стоит) почему?

[\$]?[0-9,]*\.[0-9][0-9] 

Я понимаю, что регулярное выражение принимает тот случай, когда добавляются несколько запятых, а также необходимо две цифры после запятой. У меня была идея, как это исправить. Я сузил его до, возможно, *\. как проблема

EDIT

Я нашел регулярное выражение выражения, которое работало [\$]?([0-9,])*[\.][0-9]{2}, но я до сих пор не знаю, как и почему он был терпит неудачу в первой очереди

Я использую .formatCurrency() для форматирования ввода в формат денег. Его можно найти here, но он по-прежнему позволяет использовать альфа-символы, поэтому я должен его замаскировать с помощью $(this).inputmask('Regex', { regex: "[\$]?([0-9,])*[\.][0-9]{2}" });, где найдена маска ввода here и $(this) - это ссылка на элемент ввода текста типа. Мой код будет выглядеть примерно так:

<input type="text" id="123" data-Money="true"> 

//in the script 
.find("input").each(function() {   
     if ($(this).attr("data-Money") == "true") {        
      $(this).inputmask('Regex', { regex: "[\$]?([0-9,])*[\.][0-9]{2}" }); 
      $(this).on("blur", function() { 
       $(this).formatCurrency(); 
      }); 

Надеюсь, это поможет. Я пытаюсь создать JSfiddle, но Idk, как добавить внешние библиотеки/плагин/расширение

+1

ты ошибаешься, или там отсутствует контекст. – muhmuhten

+2

Обратная косая черта в '\ .', вероятно,« съедается »любым программным обеспечением, которое вы используете. Вам нужно будет указать специфику вашей среды, код ошибки и т. Д. –

+0

Какой инструмент или язык вы используете, то, что вы говорите, невозможно, если только инструмент, который вы используете, не может что-то сказать об этом :) –

ответ

3

«регулярное выражение» вы используете в вашем примере сценарий не является RegExp :

$(this).inputmask('Regex', { regex: "[\$]?([0-9,])*[\.][0-9]{2}" }); 

Скорее, это строка, которая содержит шаблон, который при некотором р oint преобразовывается в настоящий RegExp вашей библиотеки, используя что-то вдоль линий

var RE=!(value instanceof RegExp) ? new RegExp(value) : value; 

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

Таким образом, RegExp, созданный из вашей строки, вообще не видит обратную косую черту.

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

Таким образом, вместо:

$(this).inputmask('Regex', { regex: "[\$]?([0-9,])*[\.][0-9]{2}" }); 

использование

$(this).inputmask('Regex', { regex: /[\$]?([0-9,])*[\.][0-9]{2}/ }); 

И я считаю, ваш "регулярное выражение" будет выполнять, как вы ожидаете.

(Обратите внимание на использование слэша / разграничить ваш шаблон, который JavaScript будет использовать, чтобы обеспечить истинную RegExp.)

+0

Вы узнали о 'var RE =! (Значение instanceof RegExp)? новый RegExp (значение): значение; ', прочитав исходный код? и почему я не могу пометить тебя? –

+0

Нет, хотя я мог бы, если вы пожелаете. Я уверен, что я прав, хотя я _assumed_, это было так, потому что вы предоставили значение String. –

+0

О, нет, хорошо.Я просто пытался выяснить, были ли это общие знания или что-то специфическое для jquery.inputmask –

1

Во-первых, вы можете заменить '[0-9]' на '\ d'. Таким образом, мы можем переписать первое выражение немного более чисто, как

\$?[\d,]*\.\d\d 

Рассекая это вниз:

\$?  - A literal dollar sign, zero or one 
[\d,]* - Either a digit or a comma, zero or more 
\.  - A literal dot, required 
\d  - A digit, required 
\d  - A digit, required 

Из этого мы можем видеть, что минимальная правовая строка длиной \.\d\d, три символа. Регулярное выражение, которое вы указали, будет never проверить на любую строку символов.

Глядя на ваш второй регулярное выражение,

[\$]?  - A literal dollar sign, zero or one 
([0-9,])* - Either a digit or a comma, subexpression for later use, zero or more 
[\.]  - A literal dot, required 
[0-9]{2} - A digit, twice required 

Это имеет тот же самый минимальный Matchable строку как выше - \.\d\d.

Редактировать: Как уже упоминалось, в зависимости от языка вам может понадобиться избежать косой черты, чтобы гарантировать, что язык не будет интерпретировать язык при обработке строки.

Кроме того, как показано ниже, приведенное ниже регулярное выражение, вероятно, ближе к тому, что вам нужно.

[A-Z]{3} ?(\d{0,3}(?:([,. ])\d{3}(?:\2\d{3})*)?)(?!\2)[,.](\d\d)\b 

Объяснение:

[A-Z]{3}  - Three letters; for an ISO currency code 
?    - A space, zero or more; for readability 
(    - Capture block; to catch the integer currency amount 
    \d{0,3}  - A digit, between one and three; for the first digit block 
    (?:   - Non capturing block (NC) 
    ([,. ])  - A comma, dot or space; as a thousands delimiter 
    \d{3}   - A digit, three; the first possible whole thousands 
    (?:   - Non capturing block (NC) 
     \2    - Match 2; the captured thousands delimiter above 
     \d{3}   - A digits, three 
    )*    - The above group, zero or more, i.e. as many thousands as we want 
)?    - The above (NC) group, zero or one, ie. all whole thousands 
)    - The above group, i.e everything before the decimal 
[.,]   - A comma or dot, as a decimal delimiter 
(\d{2})  - Capture, A digit, two; ie. the decimal portion 
\b    - A word boundry; to ensure that we don't catch another 
       digit in the wrong place. 

Отрицательная опережения был предоставлен ответ от Джона Kugelman в this question.

Это правильно соответствует (матчи, заключенные в квадратные скобки):

[AUD 1.00] 
[USD 1,300,000.00] 
[YEN 200 000.00] 
I need [USD 1,000,000.00], all in non-sequential bills. 

Но не:

GBP 1.000 
YEN 200,000 
Смежные вопросы