SQL Server:具有重复模式的正则表达式

时间:2016-03-18 09:54:50

标签: regex sql-server-2008

我的表格中有一列包含emailId,其格式为每个字符后跟*

例如:

a*b*c*@*g*m*.*c*m*

a*b*2*d*@*g*m*.*c*m*

j*a*t*i*n*@*g*m*a*i*l*.*c*o*m*

a*3*c*@*g*m*.*c*m*

第一个字符应为字母,其余可以是字母数字,后跟@' then *`等等。

为什么我需要这个: 我要求验证数据库中的数据是否为所需格式(如上所述)。 并找出不符合标准的行。

我试过了:

select * 
from test 
where email like '[a-zA-Z][*][a-zA-Z0-9][*][a-zA-Z0-9][*][@][*]%'

满足:

a*b*c*@*g*m*.*c*m*
a*3*c*@*g*m*.*c*m*

我试过了:

select * 
from test 
where email like '[a-zA-Z][*]([a-zA-Z0-9][*])%'

满足:

a*(v*)+s@* which is **INVALID EMAIL ID** 

我试过,通常适用于C#:

select * 
from test 
where email like '[a-zA-Z][*]([a-zA-Z0-9][*]){2,}%'

但它没有用。

任何建议/帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

技术上LIKE不是正则表达式。它基本上只支持字符类(括号中的东西),通配符(_,与典型的.不同),以及字符串中的部分匹配(%like this%,并省略% }基本上像^$}这样的锚。

我知道SQL很少,而且我对MS SQL完全不熟悉。如果我遗漏了任何东西(你的数据应该比我的更好),请告诉我。 (仅供参考,电子邮件a.b.d@gmail.com有效,因此我在正确*填充后就已允许这样做了。但是还有许多其他有效的电子邮件会拒绝,例如+或{{ 1}}。)

-

我使用以下命令here进行了测试:

SELECT email FROM Temp1
WHERE (
       --Starts with alpha
        email LIKE '[a-zA-Z][*]%'
       --Letter after character always *
        AND email NOT LIKE '%[a-zA-Z0-9.@][^*]%'
       --has an @
        AND email LIKE '%[@][*][a-zA-Z]%'
       --Must have alpha numerics around decimal
        AND email NOT LIKE '%[^a-zA-Z0-9][*][.][*][^a-zA-Z0-9]%'
       --Never 2 @'s
        AND email NOT LIKE '%[@]%[@]%'
       --Never ends with @* or .*
        AND email NOT LIKE '%[@.][*]'
       --Must end with *
        AND email NOT LIKE '%[^*]'
      );

答案 1 :(得分:-1)

试试这个RegEx:

[a-zA-Z][*]([a-zA-Z0-9][*])+[@][*][a-zA-Z][*]([a-zA-Z0-9][*])+([.][*]([a-zA-Z][*])+)+

这是Live Demo

如何运作

[a-zA-Z][*]         # Letter, followed by * (a*, b*, c*)
([a-zA-Z0-9][*])+   # Letter / Number followed by *, appearing one or more times (2*d*, a*b*)
[@]                 # @ Sign
[*][a-zA-Z][*]      # Letter, followed by * (a*, b*, c*)
([a-zA-Z0-9][*])+   # Letter / Number followed by *, appearing one or more times (2*d*, a*b*)
(
[.][*]              # . followed by * (for TLD)
([a-zA-Z][*])+      # Letter, followed by * (a*, b*, c*), appearing one or more times (a*b*)
)+                  # The TLD (above 2 rules, for .com, .org, .net) can have multiple dots
                    # I.e. (.co.uk, .com.vn, .us.org)
相关问题