6

正規表現に一致するようにJavascriptを使用して文字列をフォーマットするにはどうすればよいですか?

次のいずれかに一致する可能性のある英国の郵便番号を使用しています

N1 3LD
EC1A 3AD
GU34 8RR

文字列を正しく検証する次の正規表現がありますが、正規表現をマスクとして使用して/ EC1A3ADto / toにフォーマットする方法がわかりません。EC1A 3ADGU348RRGU34 8RRN13LDN1 3LD

私の正規表現は/^[A-Za-z]{1,2}[0-9A-Za-z]{1,2}[ ]?[0-9]{0,1}[A-Za-z]{2}$/

ありがとうございました

4

3 に答える 3

17

正規表現を使用する場合/^([A-Z]{1,2}\d{1,2}[A-Z]?)\s*(\d[A-Z]{2})$/は、郵便番号の2つの部分を抽出し、間にスペースを置いてそれらを再構成できます。

var list = ['N13LD', 'EC1A3AD', 'GU348RR'];

for (var i = 0; i < list.length; i++) {
  var parts = list[i].match(/^([A-Z]{1,2}\d{1,2}[A-Z]?)\s*(\d[A-Z]{2})$/);
  parts.shift();
  alert(parts.join(' '));
}

出力

N1 3LD
EC1A 3AD
GU34 8RR
于 2012-05-22T11:59:20.477 に答える
1

オプションのスペースで区切られたビットを中かっこで囲みます。

/^([A-Za-z]{1,2}[0-9A-Za-z]{1,2})[ ]?([0-9]{0,1}[A-Za-z]{2})$/

しかし、正規表現は間違っていると思います...上記の正規表現は、「N13LD」を「N13」、「LD」に分割します。

誤った部分は、{0,1}末尾の2文字の前にあると思われます。AFAIKは正確に1桁である必要があります。

var re = /^([A-Z]{1,2}[\dA-Z]{1,2})[ ]?(\d[A-Z]{2})$/i; // case insensitive

グループ化により、string.match(regexp)関数は一致する各グループのエントリを含む結果を返すことができます。

> "N13LD".match(re);
["N13LD", "N1", "3LD"]

> "GU348RR".match(re);
["GU348RR", "GU34", "8RR"]

> "EC1A3AD".match(re);
["EC1A3AD", "EC1A", "3AD"]

結果を取得するには、簡単な文字列連結を使用して、各結果の2番目と3番目の要素を結合します。

于 2012-05-22T11:22:24.217 に答える
1

上記の@borodinの優れた回答を使用して、英国の郵便番号を入力したままのフォーマッターを作成しました。これは郵便番号を検証せず、ユーザーが入力したボロディンの正規表現に従ってフォーマットするだけであることに注意してください。

var txtPc = $("#postcode");
var outputCount = 0;
var jigCount = 0;
var postcodePauseTime = 500;

txtPc.on("keydown", function(e) {
  var keyCode = e.which;

  var key = String.fromCharCode(keyCode);
  var isAlphaNumeric = //key.match(/^[a-z0-9]+$/i);
    (
      (keyCode >= 65 && keyCode <= 90) ||
      (keyCode >= 48 && keyCode <= 57) ||
      ([189, 190, 8, 46, 9].indexOf(keyCode) > -1) ||
      (keyCode >= 35 && keyCode <= 40)
    );

  return !!isAlphaNumeric;
});
// handle click and add class
txtPc.on("keyup", function(e) {
  PostcodeCalculateFormat(txtPc);
});

txtPc.on("blur", function() {
  PostcodeCalculateFormat(txtPc);
});

function PostcodeCalculateFormat(txtPc) {
  (function(index, txtPc) {
    setTimeout(function() {
      //prevent interferance from other keypresses by returning out of this closure
      if (index != jigCount) return;
      var isFocused = ($('#' + txtPc.attr('id') + ':focus')[0] == document.activeElement);
      var postcodeText = txtPc.val().toUpperCase(); /// + key;
      var origSpacePos = postcodeText.indexOf(" ");
      postcodeText = postcodeText.replace(/[\W_]+/g, "");
      var parts = postcodeText.match(/^([A-Z]{1,2}\d{1,2}[A-Z]?)\s*(\d[A-Z]{2})$/i);
      //if unable to match the lot, try the first part only with less strict reg
      if (!parts)
        parts = postcodeText.match(/^([A-Z]{1,2}\d{1,2}[A-Z]?)\s*(.*)$/i);
      if (parts) {
        var caretPos = 0;
        if (isFocused)
          caretPos = getCaretPosition(txtPc[0]).start;
        parts.shift();
        var newVal = parts.join(' ');
        if (newVal == txtPc.val())
          return;
        output(newVal);
        txtPc.val(newVal);
        var spacePos = newVal.indexOf(" ");
        if (isFocused) {
          if (caretPos >= spacePos && origSpacePos == -1)
            caretPos++;

          setCaretPosition(txtPc[0], caretPos, caretPos);
        }
      }
    }, postcodePauseTime);
  }(++jigCount, txtPc));
}

function output(str) {
  $("#listOutput").prepend("<li>[" + (++outputCount) + "] " + str + "</li>");
}

function getCaretPosition(ctrl) {
  // IE < 9 Support
  if (document.selection) {
    ctrl.focus();
    var range = document.selection.createRange();
    var rangelen = range.text.length;
    range.moveStart('character', -ctrl.value.length);
    var start = range.text.length - rangelen;
    return {
      'start': start,
      'end': start + rangelen
    };
  }
  // IE >=9 and other browsers
  else if (ctrl.selectionStart || ctrl.selectionStart == '0') {
    return {
      'start': ctrl.selectionStart,
      'end': ctrl.selectionEnd
    };
  } else {
    return {
      'start': 0,
      'end': 0
    };
  }
}


function setCaretPosition(ctrl, start, end) {
  // IE >= 9 and other browsers
  if (ctrl.setSelectionRange) {
    ctrl.focus();
    ctrl.setSelectionRange(start, end);
  }
  // IE < 9
  else if (ctrl.createTextRange) {
    var range = ctrl.createTextRange();
    range.collapse(true);
    range.moveEnd('character', end);
    range.moveStart('character', start);
    range.select();
  }
}
body {
  background: silver;
  padding: 20px;
  font-family: Helvetica;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>

<div>Sample postcodes to type: 'BT92PE', 'EC1A3AD', 'GU348RR', 'N13LD'</div>

<div>
  Postcode: <input id="postcode" style="text-transform: uppercase; " />
</div>

<!-- for troubleshooting -->
<ul id="listOutput"></ul>

カレットのget&set関数は、スタックオーバーフローの回答から直接取得されました。これは、ユーザーにクレジットを与えるために現在見つけることができません。可能であれば、リンクを確認して更新します。

これは私が望むすべてのことを行いますが、それはあまりエレガントな解決策ではありません。誰かがこれを改良、強化、または改善してくれることを嬉しく思います。結果を見たいのですが。

将来の改善:キャレットがスペースの後にある場合、バックスペースキーは1回のキー押下でスペースとその前の英数字を削除する必要があります。(キャレットがスペースの前にある場合は、削除ボタンについても同じ考えです。)

于 2018-06-05T19:57:49.810 に答える