正则表达式只匹配某些字符或字符串,每个只匹配一个实例?

时间:2017-04-29 13:49:49

标签: javascript jquery regex web

我觉得我对Regexes的了解已经足够了。也就是说,我有一个输入字段,允许用户输入他们的货币符号。我只想允许所述货币符号并禁止其他任何东西进入该字段。有些国家实际上没有一个符号,但只有两三个字符,例如" Kr"对于克朗。因此,该字段的最大长度为3.鉴于它需要最大长度为3以容纳某些货币,我也不想允许输入三个美元符号,例如" $$$& #34 ;.我只想允许一美元,英镑,欧元等标志。

这是我在输入中仅允许这些符号的基本代码:

$('#id_currency_symbol').on('input',function (){
    var value = $(this).val().toString();
    newvalue = value.replace(/[^$£€¥₣₩₩¥₽₺₹Rkr]+/g,'');
    $(this).val(newvalue);
});

这仅适用于允许这些符号/字母,但正如我上面所述,我不想让用户输入多个符号的单个实例,即美元符号($)。另外,我希望匹配"符号"的情况下的确切字符串。实际上只有两三个字符。在Krona的情况下,"符号"是Kr。鉴于上述情况,用户理论上可以进入" rK"根据正则表达式它将完全有效,但我只想允许" Kr。"的完全匹配。这可能吗?

由于

2 个答案:

答案 0 :(得分:0)

您可以使用正则表达式找到第一个出现的货币符号或首字母缩写词,然后用匹配的字符串替换整个输入。单个字符货币可以在[...]中列出,任何更长的字符串都可以通过替换添加:



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"));




为了完整性:

  1. "正则表达式只匹配某些字符或字符串,并且每个只有一个实例"

    ^(?:[$£€¥₣₩₩¥₽₺₹]|kr)$
    

    演示:https://regex101.com/r/w9p9d9/1

  2. 正则表达式除了"某些字符或字符串" 以及这些字符时,如果它们出现多次(在newvalue = value.replace(...,'');内使用) :

    ^(?=.*?([$£€¥₣₩₩¥₽₺₹]|kr)|).*
    

    演示:https://regex101.com/r/qocsv5/1

答案 1 :(得分:0)

我建议忘记正则表达式,然后去找O(1)algos,

var allowedCurrencyCodes = {
      "$":true,
      "¢":true,
      "£":true,
      "INR":true,
      "Kr":true,
      .....,
      .....,
      .....
}
    $(this).val(allowedCurrencyCodes[$(this).val()]?$(this).val():"");

你需要在模糊事件或者用户输入至少3个字符时执行检查,否则它会变得有问题,因为它会在第一个字符后立即擦除数据。

如果你想保持实时检查,即在用户输入时做出响应,那么你需要改变allowedCurrencyCodes的结构并将其转换为多字母货币代码的嵌套对象,例如$,£will完全相同,但INR或Kr将被定义为

"I":{
    "N":{
        "R":true
    }
},
"K":{
    "r":true
}

将应用获取逻辑中的微小更改,您将捕获输入并将其拆分为数组,然后根据输入字符放入allowedCurrencyCodes,例如

allowedCurrencyCodes[inputChar[0]][inputChar[1]]

allowedCurrencyCodes[inputChar[0]][inputChar[1]][inputChar[2]]