如何在JavaScript中将字符串限制为特定的字符集? 把这放到上下文中,考虑这2个函数: ml_RestrictToChars = function(input,regex) { var result = '';var c = ''; var rx = new RegExp(regex); for (var i = 0; i < input.length; i++) { c = input.charAt(i); if (rx.test(c)) { result += c; } } return result; }; ml_OmitChars = function(input,regex) { var rx = new RegExp(regex,'g'); return input.replace(rx,''); }; ml_RestrictToChars=函数(输入,正则表达式){ var结果=“”;var c=“”; var rx=新的RegExp(regex); 对于(变量i=0;i

如何在JavaScript中将字符串限制为特定的字符集? 把这放到上下文中,考虑这2个函数: ml_RestrictToChars = function(input,regex) { var result = '';var c = ''; var rx = new RegExp(regex); for (var i = 0; i < input.length; i++) { c = input.charAt(i); if (rx.test(c)) { result += c; } } return result; }; ml_OmitChars = function(input,regex) { var rx = new RegExp(regex,'g'); return input.replace(rx,''); }; ml_RestrictToChars=函数(输入,正则表达式){ var结果=“”;var c=“”; var rx=新的RegExp(regex); 对于(变量i=0;i,javascript,regex,replace,inverse-match,Javascript,Regex,Replace,Inverse Match,第一个函数将输入限制为某一组字符,第二个函数将从输入中省略任何字符或字符序列。从第一个函数中的代码可以看出,只有将单个字符类传递到“regex”参数时,它才会起作用,因为包含代码一次只检查一个字符 考虑输入字符串12-34,现在如果我将'[0-9]的正则表达式传递给第一个函数,并将'[^0-9]'传递给第二个函数,我将得到与预期相同的输出:1234 但是,如果我在第二个函数中使用更高级的表达式,例如'[^0-9][^0-9]-',我将得到12-的输出。但是,如果我将多个字符类传递给第一个函数,它

第一个函数将输入限制为某一组字符,第二个函数将从输入中省略任何字符或字符序列。从第一个函数中的代码可以看出,只有将单个字符类传递到“regex”参数时,它才会起作用,因为包含代码一次只检查一个字符

考虑输入字符串
12-34
,现在如果我将
'[0-9]
的正则表达式传递给第一个函数,并将
'[^0-9]'
传递给第二个函数,我将得到与预期相同的输出:
1234

但是,如果我在第二个函数中使用更高级的表达式,例如
'[^0-9][^0-9]-'
,我将得到
12-
的输出。但是,如果我将多个字符类传递给第一个函数,它将返回一个空字符串


我想知道的是,是否有一种简单的方法(最好没有循环)来实现ml_省略字符的反转,这样它们的工作方式就类似了?

匹配每个字符很简单(但速度很慢),您可以演示它是如何工作的。现在需要的是匹配一个模式并连接所有匹配项。这是这样做的:

ml_RestrictToChars = function(input,regex) {
    var rx = new RegExp (regex, 'g');
    var matches = input.match (rx);
    return matches.join ('');
};

第一行使其成为“全局”正则表达式,它更改match()的行为。第二行返回数组中的所有匹配项,最后一行将它们合并成一个字符串并返回。

为什么要在ml_RestrictToChars函数中测试每个字符?如果它不使用这种方法测试每个字符,将无法排除字符。这就是if(rx.test(c))行所做的——确定每个字符是否应该包含在结果中。我并不是说这是解决问题的唯一方法,我希望有人能够从不同的角度来解决这个问题。啊,然后你可以使用你的omitchars函数,返回原始函数和omitchars函数之间的差异。这会反映你的功能。好的,很好,但我怎么能做到呢?我能想到的唯一方法是a)调用OmitChars b)通过结果的每个字符循环,c)对输入执行嵌套循环以删除OmitChars结果中的字符。感谢您花时间解决这个问题。我想这就行了。