簡體   English   中英

正則表達式強制第一個字符后的單個空格

[英]Regular expression to force single blank space after a first character

如何在用戶輸入第一個字符后強制使用空格。 我只需要在第一個字符之后留一個空格(在第一個字符之前不允許有空格)。 在第一個字符和空格之后,最多可以有40個字符。

到目前為止,我發現了這個,但不符合我的需求

$('.singleSpace').keyup(function() {
  var foo = $(this).val().split(" ").join(""); // remove hyphens
  if (foo.length > 0) {
    foo = foo.match(new RegExp('.{1}', 'g')).join(" ");
  }
  $(this).val(foo);
});

樣品

我不知道為什么要這樣做,但是要刪除空格,可以使用以下命令:

var str = $(this).val().replace(" ", "");

並在第一個字符后添加一個空格:

var str = $(this).replace("^(.)(.*)$", "$1 $2");

您需要正則表達式嗎?

$('.singleSpace').keyup(function() {
  var $el = $(this);
  var val = $el.val();
  if (val.length === 1) {
    $el.val(val + ' ');
  }
});

您可以使用以下代碼:

$('.singleSpace').keyup(function() {
    var foo = $(this).val().replace(/^( *)([^ ] *)(.*)/g, function(_,b,c,d){
        return $.trim(c) + ' ' + d.replace(/ /g, '').slice(0,40);
    })

    $(this).val(foo)
});

唯一的問題是光標位置。 如果您在光標不在結尾處鍵入內容,則光標將始終返回結尾。

自己看看: http : //jsfiddle.net/S3gJL/2/

我建議您將函數放在模糊事件中,但這也可能很煩人。

您的要求一點都不簡單。 有很多變化,用戶可以復制粘貼,選擇和刪除。 很難阻止一切。

上面提供的代碼阻止了很多彎路(只有不阻止的事情是右鍵單擊粘貼,也許還有其他我沒有想到的事情 ),但是具有上述成本。 您可能想要搜索插件或雇用某人來開發一個好的系統。


編輯1

刪除第一個之后的寫空間授權。


編輯2

對於此處的光標位置,修復:

$('.singleSpace').keyup(function() {
    var foo = this.value.replace(/^( *)([^ ] *)(.*)/g, function(a,b,c,d,e){
        return $.trim(c) + ' ' + d.replace(/ /g, '').slice(0,40);
    })

    var carretPos = doGetCaretPosition(this)

    carretPos += foo.length - this.value.length

    this.value = foo;

    setSelectionRange(this, carretPos, carretPos)
});


//Code taken from
// http://stackoverflow.com/questions/17858174/set-cursor-to-specific-position-on-specific-line-in-a-textarea
function setSelectionRange(input, selectionStart, selectionEnd) {
    if (input.setSelectionRange) {
        input.focus();
        input.setSelectionRange(selectionStart, selectionEnd);
    }
    else if (input.createTextRange) {
        var range = input.createTextRange();
        range.collapse(true);
        range.moveEnd('character', selectionEnd);
        range.moveStart('character', selectionStart);
        range.select();
    }
}

//Code taken from
// http://stackoverflow.com/questions/2897155/get-cursor-position-in-characters-within-a-text-input-field
function doGetCaretPosition (oField) {

    // Initialize
    var iCaretPos = 0;

    // IE Support
    if (document.selection) {

        // Set focus on the element
        oField.focus ();

        // To get cursor position, get empty selection range
        var oSel = document.selection.createRange ();

        // Move selection start to 0 position
        oSel.moveStart ('character', -oField.value.length);

        // The caret position is selection length
        iCaretPos = oSel.text.length;
    }

    // Firefox support
    else if (oField.selectionStart || oField.selectionStart == '0')
        iCaretPos = oField.selectionStart;

    // Return results
    return (iCaretPos);
}

小提琴

完成var處理光標位置

var val="";
$('.singleSpace').keyup(function() {
    var ele = $(this)[0];
    var foo = ele.value;
    if(val==foo){return false}
    var startPos = ele.selectionStart;
    var endPos = ele.selectionEnd;
    if(event.keyCode==8){
        var diff=endPos-startPos;
        startPos-=diff;
        endPos-=diff;
    }
    foo = foo.replace(new RegExp('( )','g'),'');
    foo = foo.replace(new RegExp('^ *(.) *(.*?)'),'$1 $2');
    val=foo;
    ele.value=foo;
    ele.selectionStart=startPos;
    ele.selectionEnd=endPos;
});

這是您想要的regExp: *(.) *(.*?)並且您想使用.replace不匹配

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM