我有一个应该只接受字母的输入字段(大小写无关紧要)。
我可以简单地使用 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次,而+表示至少一次。所以空字符串将匹配 [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.
但是还有一种更简单的方法可以使用
FIND REGEX
来做到这一点。命令而不是类 cl_abap_matcher: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.
^
表示否定。所以[^a-zA-Z]
表示不在给定范围内的任何字符。
关于regex - 验证字符串只包含字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12420898/