Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正则表达式只匹配某些字符或字符串,并且每个字符或字符串只匹配一个实例?_Javascript_Jquery_Regex_Web - Fatal编程技术网

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

Javascript 正则表达式只匹配某些字符或字符串,并且每个字符或字符串只匹配一个实例?,javascript,jquery,regex,web,Javascript,Jquery,Regex,Web,我觉得我对正则表达式的了解已经足够多了。也就是说,我有一个输入字段,允许用户输入他们的货币符号。我只想允许上述货币符号,不允许其他任何东西进入该字段。有些国家实际上没有一个符号,但只有两三个字符,例如,“Kr”代表克朗。因此,该字段的最大长度为3。考虑到它需要最大长度为3才能容纳某些货币,我也不想允许输入三个美元符号,例如“$$”。我只想让一美元、一英镑、一欧元等等签字 以下是我在输入中仅允许这些符号的基本代码: $('#id_currency_symbol').on('input',funct

我觉得我对正则表达式的了解已经足够多了。也就是说,我有一个输入字段,允许用户输入他们的货币符号。我只想允许上述货币符号,不允许其他任何东西进入该字段。有些国家实际上没有一个符号,但只有两三个字符,例如,“Kr”代表克朗。因此,该字段的最大长度为3。考虑到它需要最大长度为3才能容纳某些货币,我也不想允许输入三个美元符号,例如“$$”。我只想让一美元、一英镑、一欧元等等签字

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

$('#id_currency_symbol').on('input',function (){
    var value = $(this).val().toString();
    newvalue = value.replace(/[^$£€¥₣₩₩¥₽₺₹Rkr]+/g,'');
    $(this).val(newvalue);
});
这只适用于允许这些符号/字母,但正如我上面所说的,我不希望允许用户输入某些符号的多个实例,即美元符号($)。此外,我希望在“符号”实际上只有两三个字符的情况下匹配精确的字符串。在克朗的例子中,“符号”是Kr。鉴于上述情况,理论上用户可以输入“rK”,根据正则表达式,它完全有效,但我只想允许“Kr”的精确匹配。这可能吗


谢谢

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

var checkInput=函数(输入){
var regex=/[$欧元¥欧元₩¥₽₺₹]|kr/i;
输入=regex.exec(输入);
返回输入==null?”:输入[0];
}
log(checkInput(“lkjahfkdshfjsdf Kr asdasda”);
日志(checkInput(“kr”));
控制台日志(检查输入(“rk”);
console.log(checkInput(“$$”);
控制台日志(检查输入₩"));

log(checkInput(“ABC”);
我建议忘记regex,选择O(1)算法

您需要在blur事件或当用户输入至少3个字符时执行检查,否则它会出现错误,因为它会在第一个字符之后继续擦除数据

如果您想保持实时检查,即用户输入时响应,则需要更改
allowedCurrencyCodes
的结构,并将其转换为多字符货币代码的嵌套对象,例如$,$将完全相同,但INR或Kr的定义如下

"I":{
    "N":{
        "R":true
    }
},
"K":{
    "r":true
}
取数逻辑中的微小变化将被应用,您将捕获输入并将其拆分到数组中,然后根据输入字符插入
allowedCurrencyCodes
,如

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


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

让人们从下拉列表中选择货币更有意义。验证freetext字段中所有可能的值几乎是不可能的。也许可以让用户输入他们想要的任何值,然后在
模糊事件中查看值,如果用户输入同一字符三次,则减少该值如果一个合法的货币符号(我怀疑它们是许多符号)重复同一个字符三次,这可能会受到影响。请尝试此
/(?:$| Kr)/
@RoryMcCrossanYeah我也考虑过这一选项,但我认为下拉列表可能会很长,这对可用性来说不是很好。也就是说,我倾向于只包括最流行的货币,可能是10-15左右(我真的不需要每种货币都用于我的目的)如果是这么有限的一个数字,那么下拉列表不是一个糟糕的主意。不知道你为什么被否决。这些似乎满足了我的需要,但我很难让它们在我上面介绍的代码中工作。似乎当我使用你给出的代码时(任意一个选项)它将允许在输入中输入除正则表达式中的字符以外的任何其他字符。我可以更改什么以只允许正则表达式中的字符?谢谢
"I":{
    "N":{
        "R":true
    }
},
"K":{
    "r":true
}