用jQuery限制重复字符的数量,但只留下句号

时间:2017-07-03 07:34:54

标签: jquery input limit

我使用此代码来避免用户连续多次重复一次角色(&#34; bbb&#34;,&#34; ddd&#34;左右......):< / p>

&#13;
&#13;
$('.limitRepeaters').keypress(function(){
  if (/(.)\1{2,}/.test($(this).val())) {
   return false;
  }
})
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="limitRepeaters">
&#13;
&#13;
&#13;

现在我希望用户能够重复&#34;期间&#34; charcter三次(...)所以我试过:

&#13;
&#13;
$('.limitRepeaters').keypress(function(e){
   var code = e.keyCode || e.which;
  if ((/(.)\1{2,}/.test($(this).val())) && (code != '190')) {
   return false;
  }
})
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="limitRepeaters">
&#13;
&#13;
&#13;

但这似乎不起作用。任何想法?

修改

我现在遇到了问题。实际上当用户在写完后写了一封信&#34; ...&#34;没有键入190键代码,因此需要将190键代码添加到正则表达式本身。知道怎么做吗?

3 个答案:

答案 0 :(得分:0)

使用您提到的相同的块但具有以下更改。

package package1;

public class Strings {
  public static void main(String[]args){
    int marker = 0; // changing this to 0
    StringBuffer s2 = new StringBuffer();
    StringBuffer s = new StringBuffer("AAAA");
    for(int i = 0; i<=s.length(); i++){
        while(s.charAt(i) == s.charAt(i+1)){
            marker++;
        }
        i += marker;
        s2.append(marker + 1); // print out the count plus one because we are counting from zero
        s2.append(s.charAt(i));
        marker = 0;
    }
    System.out.println(s2); // It simply prints out nothing
  }
}

在上面的代码中,我已经替换了字符串中所有出现的(...)。如果您不希望所有出现都使用$('.limitRepeaters').keypress(function(){ var str = $(this).val(); if (/(.)\1{2,}/.test(str.replace(/[...]/g,''))) { return false; } });

答案 1 :(得分:0)

现在如果得到的是:

$('.limitRepeaters').keypress(function(){
var str = $(this).val();
  if (/(.)\1{2,}/.test(str.replace(/[...]/g,'')) || /(.)\1{3,}/.test($(this).val())) {
   return false;
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="limitRepeaters"/>

这似乎有点长,也会让用户写4次(但那并不坏......)。任何较短的想法都会受到欢迎。

答案 2 :(得分:0)

要测试任何字符是否重复3次或更多次,除.外,可以使用/([^.])\1{3,}/。但是,在当前实现中,一旦达到匹配,就不允许退格或其他字符。

另一种方法是重置为keyup中的旧值,虽然这有点'不稳定'(更简化的解决方案是使用光标位置和按键生成预期值,但功能上下面更容易)

var oldValue;
$('.limitRepeaters').keypress(function(e){
	oldValue=  {val : this.value, pos : this.selectionStart }; //strictly speaking selectionEnd should be kept as well
}).keyup(function(e){
	if (/([^.])\1{3,}/.test(this.value)) {
  	this.value = oldValue.val;
    this.selectionStart = oldValue.pos;
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="limitRepeaters">

然后,一旦输入三个重复字符,可能阻止所有其他输入是目标,这根本不需要:)。在这种情况下,/([^.])\1{3,}/可以直接在现有代码中使用。