在上一篇文章 ABAP 程序中使用正则表达式验证邮箱格式是否正确 中,我使用了正则表达式来验证邮箱 Email 格式,在后续的开发中,还发现了系统标准的函数也可以用于识别电子邮箱是否有效,因此把这篇文章也记录一下如何使用标准函数来检查电子邮件。
在 ABAP 中检查电子邮件是否有效
检查电子邮件是否有效是输入电子邮件地址字段的常见业务要求。常见的邮件格式:
[mail]@[Domain].[Extension]
根据定义电子邮件地址标准的 RFC 5322 官方标准,正则表达式必须是:
(?:[a-z0-9!#$%&’*+/=?^_{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_{|}~-]+)*|”(?:[x01-x08x0bx0cx0e-x1fx21x23-x5bx5d-x7f]|[x01-x09x0bx0cx0e-x7f])*”)@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[x01-x08x0bx0cx0e-x1fx21-x5ax53-x7f]|[x01-x09x0bx0cx0e-x7f])+)])
由于各种语言对正则表达式的支持不同、语法差异和覆盖率不同,所以,不同语言里面的正则表达式也不同,你可以通过在网上搜索对应语言的 Email 正则是啥,本文只介绍 ABAP 语言。
标准函数 SX_INTERNET_ADDRESS_TO_NORMAL
对于输入字段,请确保根据数据元素 AD_SMTPADR 定义电子邮件地址字段。域 AD_SMTPADR 有 2 个转换例程:
CONVERSION_EXIT_SXIDN_INPUTCONVERSION_EXIT_SXIDN_OUTPUT
在 ABAP 中,可以利用标准函数检查电子邮箱地址的有效性: SX_INTERNET_ADDRESS_TO_NORMAL,这个函数是在 AD_SMTPADR 字段的 CONVERSION_EXIT_SXIDN_INPUT 的转换例程中调用的。
地址电子邮箱的地址类型为 INT,地址类型除了邮箱,还有 FAX、TEL 等等,可以在 SXADDRTYPE 表中查询:
*&---------------------------------------------------------------------*
*& Report ZCHECK_EMAIL
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zcheck_email.
PARAMETERS: p_email TYPE string LOWER CASE.
TYPES: sx_addr_type TYPE sx_addrtyp, "R/3 Addresstype
sx_addr TYPE so_rec_ext . "Address in plain string
TYPES: BEGIN OF sx_address, "SAPconnect general addr
type TYPE sx_addr_type,
address TYPE sx_addr,
END OF sx_address.
CONSTANTS: cx_t_int TYPE sx_addr_type VALUE 'INT'. "SMTP address
DATA: ls_addr_unst TYPE sx_address.
DATA: ls_addr TYPE sx_address.
DATA: lv_address_normal TYPE sx_address.
DATA: lv_local TYPE sx_addr.
DATA: lv_domain TYPE sx_addr.
DATA: lv_comment TYPE sx_addr.
ls_addr_unst-type = cx_t_int.
ls_addr_unst-address = p_email. " P_email : input
CALL FUNCTION 'SX_INTERNET_ADDRESS_TO_NORMAL'
EXPORTING
address_unstruct = ls_addr_unst
IMPORTING
address_normal = lv_address_normal
local = lv_local
domain = lv_domain
comment = lv_comment
addr_normal_no_upper = ls_addr
EXCEPTIONS
error_address_type = 1
error_address = 2
error_group_address = 3
OTHERS = 4.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
MESSAGE 'Email address' && ` ` && p_email && ' is valid' TYPE 'I'.
ENDIF.
这个程序的测试就交给读者自己进行了。
正则表达式
在 ABAP 中使用的电子邮件的正则表达式是:
\w+(\.\w+)*@(\w+\.)+(\w{2,4})
CL_ABAP_MATCHER 类提供了创建正则表达式和进行匹配检查的方法:
*&---------------------------------------------------------------------*
*& Report ZCHECK_EMAIL
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zcheck_email.
DATA: lv_pattern TYPE string.
DATA: lv_success TYPE char1. "abap_pool. " ABAP_FALSE/TRUE
DATA: lr_matcher TYPE REF TO cl_abap_matcher.
PARAMETERS: p_email TYPE string.
lv_pattern = '\w+(\.\w+)*@(\w+\.)+(\w{2,4})'.
lr_matcher = cl_abap_matcher=>create(
pattern = lv_pattern
text = 'test@gmail.com' ) .
TRY.
lr_matcher = cl_abap_matcher=>create(
pattern = lv_pattern
text = p_email " P_EMAIL: input
ignore_case = abap_false
simple_regex = abap_false
no_submatches = abap_false ).
CALL METHOD lr_matcher->match
RECEIVING
success = lv_success.
IF lv_success = abap_true.
MESSAGE 'Email is valid' TYPE 'I'.
ELSE.
MESSAGE 'Email is not valid' TYPE 'W'.
ENDIF.
CATCH cx_sy_regex.
MESSAGE 'Error occurs' TYPE 'E'.
CATCH cx_sy_matcher .
MESSAGE 'Error occurs' TYPE 'E'.
ENDTRY.
测试程序:
- 测试输入
hannah.morris.com
输出:Email is not valid
- 测试输入
Hannah.morris@outlook.com,得到下图: