正则表达式上大小不一的数字

时间:2018-10-31 18:11:25

标签: regex

我有一个联邦税号(整数9)(非负数),需要将其格式设置为99-9999999。 在数据库中,我们有一些不适合该格式的数据,因此我需要使用正则表达式来容纳这些数据。

值应显示为

1 => 1 
12 => 12 
123 => 12-3 
123456 => 12-3456
123456789 => 12-3456789

我还需要它不允许超过9个数字...如果用户输入9个数字,我希望正则表达式在需要的地方嵌入'-'。

这就是我尝试过的。

[\d]{1,2}(-([\d]{0,7})?)?+$

但是它允许12-(仅当两个以上的数字时才需要'-'

它允许12-34567890(超过9个数字)

4 个答案:

答案 0 :(得分:1)

我建议您分两步进行整个操作:先验证,然后格式化。

要进行验证,只需与^\d$|^\d{2}(?:-\d{1,7})?$匹配。如果不匹配,则无效。

要对其进行格式化,请使用正则表达式^(\d{2})(\d{1,7})$并替换为$1-$2

Demo

答案 1 :(得分:1)

您首先需要test()每个输入字符串,然后执行replace()重新设置其格式。 test()将使用以下正则表达式:

^\d(\d(-?\d{1,7})?)?$

匹配一个由1到9位数字组成的数字,并与-(如果存在)和replace()正确匹配,则具有以下字符:

^(\d\d)-?(\d{1,7})$

因为如果我们有两位以上的数字,我们需要插入-

演示:

var numbers = ['1-', '11', '12', '123', '123456', '123456789', '12-33']
numbers.forEach(function(n) {
    if (/^\d(\d(-?\d{1,7})?)?$/.test(n)) {
        console.log(n + ' => ' + n.replace(/^(\d\d)-?(\d{1,7})$/, '$1-$2'));
    } else {
        console.log(n + ' => Wrong format.');
    }
});

答案 2 :(得分:0)

您需要在开始时以^锚定。否则,如果您给它一个大于9位的数字,则它将与它的最后9位数字匹配。

最后删除+,因为这样可以重复-<7 digits>

您需要在?之后紧跟-,以使连字符为可选。您的正则表达式使整个-<7 digits>部分是可选的,而不是连字符本身。

在带有?量词的内容之后,不需要{0,7},因为其中的0使其为可选。

您不需要将\d放在[]内。

^\d{1,2}-?\d{0,7}$

DEMO

我认为您不能使用简单的正则表达式替换功能来重新格式化它。静态替换字符串不能根据数字是否大于两位数而在第二位数字后添加-。如果您使用的是JavaScript或PHP之类的语言,允许使用函数来计算替换值,则可以在其中放置条件。

答案 3 :(得分:0)

All in one solution

正则表达式:
^(\d{2})-?(\d{1,7})$

替换:
$1-$2

说明:
通过用捕获组替换整个匹配项,我可以捕获前2位数字,允许下一个字符为-,但不捕获,然后捕获后7位数字,并使大于此的数字无效。然后,我将全部匹配替换为两个捕获组,并将-放在两者之间。

就个人而言,我建议对这个问题采取另外两个步骤之一。我只是想表明一步是可以的