6

我正在尝试在 SQL Server 2005 中创建一个函数来检查电子邮件是否采用正则表达式的有效格式。

这是我到目前为止所拥有的:

CREATE FUNCTION isValidEmailFormat
(
    @Email varchar(100)
)
RETURNS bit
AS
BEGIN
   DECLARE @Result bit

   SET @Result = (SELECT CASE
                     WHEN @Email LIKE '%[a-zA-Z0-9_\-]+@([a-zA-Z0-9_\-]+\.)+  (com|org|edu|nz|au])%' 
                       THEN 1
                       ELSE 0
                  END AS Valid)
   RETURN @Result
END

我的正则表达式做错了吗?还是我必须做更多的事情才能将 varchar 与正则表达式进行比较?

-编辑-

现在,我输入的任何字符串都会返回 0,即使电子邮件格式本身是正确的。

4

2 回答 2

8

简短的回答是不,它不能完成。LIKE的语法与正则表达式不同(也没有那么强大)。另请参见T-SQL 中的 SQL Server 正则表达式

但是您可以跳转到 .Net 并在那里进行匹配。您可以使用sp_OACreate实例化VBScript.RegExp内部 T-SQL并使用它。

CREATE FUNCTION dbo.isValidEmailFormat
(
    @Email varchar(100)
)
RETURNS bit
AS
BEGIN
    DECLARE @pattern varchar(4000)
    SET @pattern = '[a-zA-Z0-9_\-]+@([a-zA-Z0-9_\-]+\.)+(com|org|edu|nz|au)'
    DECLARE @Result bit

    DECLARE @objRegexExp INT
    EXEC sp_OACreate 'VBScript.RegExp', @objRegexExp OUT

    EXEC sp_OASetProperty @objRegexExp, 'Pattern', @pattern
    EXEC sp_OASetProperty @objRegexExp, 'IgnoreCase', 1
    EXEC sp_OASetProperty @objRegexExp, 'MultiLine', 0
    EXEC sp_OASetProperty @objRegexExp, 'Global', false
    EXEC sp_OASetProperty @objRegexExp, 'CultureInvariant', true

    EXEC sp_OAMethod @objRegexExp, 'Test', @Result OUT, @Email

    EXEC sp_OADestroy @objRegexExp

    RETURN @Result
END

看看Regex 电子邮件验证错误 - 使用 JavaScript看看您是否希望对允许的字符限制少一点。

于 2013-03-20T12:54:43.430 回答
2

我使用了@flup 的答案并更新了 RegExp 模式,如下所示:

  • @之前的部分允许点,但不能作为第一个或最后一个字符
  • 表达式用 ^ 和 $ 锚定到字符串的开头和结尾
  • 为我使用的数据添加了特定的 TLD 和国家/地区代码

TLD 被明确列入白名单,以排除许多将 .com 输入为 .co 或 .cm 的拼写错误——哥伦比亚或喀麦隆的有效国家代码,但不适用于我的数据。

更新的行:

SET @pattern = '^([a-zA-Z0-9_\-]+\.)*[a-zA-Z0-9_\-]+@([a-zA-Z0-9_\-]+\.)+(com|org|edu|net|ca|au|coop|de|ee|es|fm|fr|gr|ie|in|it|jp|me|nl|nu|ru|uk|us|za)$'

我希望这可以为已经非常出色的答案增加价值。

于 2013-05-22T16:02:43.270 回答