我有一个输入字段,只应接受字母(大小写无关)。我可以简单地通过使用co ca(仅包含/任何)运算符来编写此代码。但这很耗时。
if p_input3 ca '*/ + - ? ! % ( ) = 0123456789'.
MESSAGE e000 WITH 'Only letters are allowed. No numbers or special characters'.
ENDIF.
有效。但是我想使用正则表达式进行检查。我尝试了这段代码。但是它不能很好地工作。
DATA: text TYPE string,
matcher type REF TO cl_abap_matcher.
PARAMETERS: p_input3 TYPE string DEFAULT 'abCD*()fhi' LOWER CASE.
matcher = cl_abap_matcher=>create(
pattern = `([a-zA-Z])`
text = p_input3
).
if matcher = abap_true.
MESSAGE e000 with 'Only letters are allowed. No numbers or special characters'.
ENDIF.
有人能弄清楚吗?
首先,您的正则表达式无效。仅当您的输入仅包含一个字母时,它才会成功。
这将正常工作:
'[a-zA-Z]*'
+
和*
表示重复。这意味着属于上一类的任意数量的字符链。区别在于*也可以表示0次,而+表示至少1次。因此,空字符串将匹配[a-z]*
,但不匹配[a-z]+
然后,您正在检查对匹配器对象本身的引用是否等于abap_true。这将永远不会发生,因为它将始终是对匹配器对象的引用,而不是abap_true或abap_false。
要获得匹配结果,您不仅需要创建匹配器,还必须通过调用其match方法来运行它。
IF matcher->match( ) = abap_false. MESSAGE e000 with 'Only letters are allowed. No numbers or special characters'. ENDIF.
但是还有一种更简单的方法来执行此操作,而不是使用cl_abap_matcher类:
FIND REGEX
FIND FIRST OCCURRENCE OF REGEX '[^a-zA-Z]' IN p_input3. IF sy-subrc = 0. MESSAGE 'There is some non-letter in your input.' TYPE 'E'. ENDIF.
表示否定。因此,^
表示不在给定范围内的任何字符。