首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用regex重新格式化包含英国邮政编码的字符串

使用regex重新格式化包含英国邮政编码的字符串
EN

Stack Overflow用户
提问于 2012-05-22 19:16:24
回答 2查看 5.7K关注 0票数 6

如何使用Javascript格式化字符串以匹配正则表达式?

我使用的英国邮政编码可以匹配以下任何一种邮政编码

代码语言:javascript
复制
N1 3LD
EC1A 3AD
GU34 8RR

我有以下正则表达式,它可以正确地验证字符串,但是我不确定如何使用正则表达式作为掩码来将EC1A3AD格式化为EC1A 3AD / GU348RRGU34 8RR / N13LDN1 3LD

我的正则表达式是/^[A-Za-z]{1,2}[0-9A-Za-z]{1,2}[ ]?[0-9]{0,1}[A-Za-z]{2}$/

谢谢

EN

回答 2

Stack Overflow用户

发布于 2012-05-22 19:22:24

将由可选空格分隔的位用大括号括起来:

代码语言:javascript
复制
/^([A-Za-z]{1,2}[0-9A-Za-z]{1,2})[ ]?([0-9]{0,1}[A-Za-z]{2})$/

然而,我认为regexp是错误的。上面的正则表达式将"N13LD“拆分为"N13","LD”。

我怀疑错误的部分是两个尾随字母之前的{0,1} -那里必须正好有一个数字:

代码语言:javascript
复制
var re = /^([A-Z]{1,2}[\dA-Z]{1,2})[ ]?(\d[A-Z]{2})$/i; // case insensitive

grouping允许string.match(regexp)函数返回结果,其中包括每个匹配组的条目:

代码语言:javascript
复制
> "N13LD".match(re);
["N13LD", "N1", "3LD"]

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

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

要得到结果,只需使用简单的字符串连接将每个结果中的第二个和第三个元素连接在一起。

票数 1
EN

Stack Overflow用户

发布于 2018-06-06 03:57:50

我使用了上面@borodin的优秀答案创建了一个随您输入的英国邮政编码格式化程序。注意,这不会验证邮政编码,只是在用户输入时根据borodin的正则表达式对其进行格式化。

代码语言:javascript
复制
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();
  }
}
代码语言:javascript
复制
body {
  background: silver;
  padding: 20px;
  font-family: Helvetica;
}
代码语言:javascript
复制
<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函数直接取自一个堆栈溢出的答案,我现在找不到这个答案来给用户信任。我会寻找和更新一个链接,如果我可以。

这做了我想要的一切,但它不是一个非常优雅的解决方案。我很高兴有人能对此进行改进、增强或改进。我想看看结果。

未来的改进:如果插入符号在空格之后,退格键应该在一次按键中删除空格和空格之前的字母数字字符。(如果插入符号在空格之前,则delete按钮的作用相同。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10700950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档