我正在尝试在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和正则表达式?
-Edit-
现在,无论我输入什么字符串都返回0,即使电子邮件格式本身是正确的。
答案 0 :(得分:5)
简短的回答是,不,不能做到。 LIKE的语法与正则表达式的语法不同(并且不如其强大)。另请参阅SQL Server Regular expressions in T-SQL
但你可以跳到.Net并在那里进行匹配。您可以使用sp_OACreate在T-SQL中实例化VBScript.RegExp
并使用它。
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 email verification error - using JavaScript,了解您是否希望对允许的字符限制较少。
答案 1 :(得分:2)
我使用了@flup的答案并更新了RegExp模式,如下所示:
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)$'
我希望这会为已经很好的答案增加价值。