[英]Regex to match only certain characters or strings and only one instance of each?
我覺得我對Regexes的了解不多,難以解決。 就是說,我有一個輸入字段,允許用戶輸入其貨幣符號。 我只想允許使用所述貨幣符號,並禁止在該字段中輸入其他任何內容。 有些國家實際上沒有單個符號,而只是兩個或三個字符,例如,克朗表示為“ Kr”。 因此,該字段的最大長度為3。由於它需要三個最大長度才能容納某些貨幣,因此我也不想輸入三個美元符號,例如“ $$$”。 我只想允許一個美元,英鎊,歐元等符號。
這是我的基本代碼,僅允許在輸入中使用這些符號:
$('#id_currency_symbol').on('input',function (){
var value = $(this).val().toString();
newvalue = value.replace(/[^$£€¥₣₩₩¥₽₺₹Rkr]+/g,'');
$(this).val(newvalue);
});
這僅適用於允許這些符號/字母,但是就像我在上面說的那樣,我不想允許用戶輸入多個符號(例如美元符號($))的單個實例。 另外,對於“符號”實際上只是兩個或三個字符的情況,我想匹配精確的字符串。 在克朗(Krona)的情況下,“符號”是Kr。 鑒於上述情況,理論上用戶可以輸入“ rK”,並且根據正則表達式將是完全有效的,但是我只希望允許“ Kr”的精確匹配。 那可能嗎?
謝謝
您可能會使用正則表達式找到第一個出現的貨幣符號或縮寫,然后將整個輸入替換為匹配的字符串。 可以在[...]
列出單字符貨幣,也可以通過交替添加任何更長的字符串:
var checkInput = function(input) { var regex = /[$£€¥₣₩₩¥₽₺₹]|kr/i; input = regex.exec(input); return input == null ? "" : input[0]; } console.log(checkInput("lkjahfkdshfjsdf Kr asdasda")); console.log(checkInput("kr")); console.log(checkInput("rk")); console.log(checkInput("$$$")); console.log(checkInput("₣₩₩")); console.log(checkInput("ABC"));
為了完整性:
“正則表達式僅匹配某些字符或字符串,每個匹配僅一個實例” :
^(?:[$£€¥₣₩₩¥₽₺₹]|kr)$
正則表達式除去“某些字符或字符串”之外的所有字符,如果這些字符出現多次(也用於newvalue = value.replace(...,'');
),則這些字符也將被剝離:
^(?=.*?([$£€¥₣₩₩¥₽₺₹]|kr)|).*
我建議您不要使用正則表達式,而選擇O(1)算法,
var allowedCurrencyCodes = {
"$":true,
"¢":true,
"£":true,
"INR":true,
"Kr":true,
.....,
.....,
.....
}
$(this).val(allowedCurrencyCodes[$(this).val()]?$(this).val():"");
您需要在模糊事件或用戶輸入至少3個字符的情況下執行檢查,否則它將變得有問題,因為它將在第一個字符后繼續清除數據。
如果要保持實時檢查,即在用戶鍵入時做出響應,則需要更改allowedCurrencyCodes
的結構,並將其轉換為嵌套的多字符貨幣代碼對象,例如,$,£完全相同,但INR或Kr將被定義為
"I":{
"N":{
"R":true
}
},
"K":{
"r":true
}
和在取邏輯微小變化將被應用,在這里將捕獲的輸入和它在陣列分割,然后浸在allowedCurrencyCodes
基於輸入字符,如
allowedCurrencyCodes[inputChar[0]][inputChar[1]]
要么
allowedCurrencyCodes[inputChar[0]][inputChar[1]][inputChar[2]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.