正则表达式,用于匹配带有或不带有破折号的数字模式

时间:2019-05-09 00:05:56

标签: regex regex-lookarounds regex-group

电子邮件主机是否具有后端存档平台。我问他们是否可以在电子邮件中找到某些格式的警报,他们要求我向他们提交一个RegEx查询字符串,以便他们可以将其放入该系统中。我知道那里的主要电子邮件系统是Exchange,但是我不确定到底有什么后端。...我假设正在交换,我很抱歉,我什至没有想到要求提供该信息。

需要查找以下数字格式(用于社会保险#格式)

9位数格式:

XXX-XX-XXXX

XXXXXXXXX

XX-XXXXXXX

需要查找以下数字格式(适用于客户帐户编号格式)

8位数字格式:

xxxxxxxx

我还没有尝试过任何东西,因为我不确定如何在不提交主机的情况下进行测试。但这就是我想出的两种st法来完成8位和9位数字模式的任务

Regex.Match([/d]+[/d]+\-?[/d]+\-?[/d]+[/d-]+\-?[/d]+[/d]+[/d]+[/d]);
``
Regex.Match([/d]+[/d]+[/d]+[/d]+[/d]+[/d]+[/d]+[/d]);

我希望输出是与数字序列模式匹配的任何电子邮件

2 个答案:

答案 0 :(得分:0)

我将使用以下正则表达式模式,这是三个术语的替代:

\d{8}\d?|\d{3}-\d{2}-\d{4}|\d{2}-\d{7}

Demo

请注意,正则表达式中的单个数字由\d表示,带有单个反斜杠,而不是正斜杠。

答案 1 :(得分:0)

为简单起见,您可能希望设计一个简单的表达式,也许类似于this,以便随时随地易于更改:

([0-9]{3}-[0-9]{2}-[0-9]{4})|([0-9]{9})|([0-9]{2}-[0-9]{7})|([0-9]{8})

每个数字都有四个分组:

  • ([0-9]{3}-[0-9]{2}-[0-9]{4}) for SSN type 1
  • ([0-9]{9}) for SSN type 2
  • ([0-9]{2}-[0-9]{7})用于SSN类型3

  • ([0-9]{8})用于客户帐号

您只需使用OR即可加入此论坛:

([0-9]{3}-[0-9]{2}-[0-9]{4})|([0-9]{9})|([0-9]{2}-[0-9]{7})|([0-9]{8})

如果您希望有两个单独的表达式,则可能希望将前两个表达式连接起来:

([0-9]{3}-[0-9]{2}-[0-9]{4})|([0-9]{9})|([0-9]{2}-[0-9]{7})

,第二个表达式的工作方式为:

([0-9]{8}) 

您可以根据需要添加其他边界。例如,您可以将它们与开始和结束字符绑定:

两个RegEx:

^([0-9]{3}-[0-9]{2}-[0-9]{4})|([0-9]{9})|([0-9]{2}-[0-9]{7})|([0-9]{8})$

SSN RegEx:

^([0-9]{3}-[0-9]{2}-[0-9]{4})|([0-9]{9})|([0-9]{2}-[0-9]{7})$

客户帐户正则表达式:

^([0-9]{8})$

enter image description here

此图显示了表达式的工作方式,您可以在此link中可视化其他表达式:

enter image description here

JavaScript测试

const regex = /([0-9]{3}-[0-9]{2}-[0-9]{4})|([0-9]{9})|([0-9]{2}-[0-9]{7})|([0-9]{8})/gm;
const str = `111-22-3333
111223333
11-1234567
12345678`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}