ABAP正则表达式:字符串仅包含字母

kk-*_*v11 3 regex sap abap matcher

我有一个输入字段,只能接受字母(无论是低位还是大写).我可以简单地使用co ca(仅包含/任何)运算符来编写它.但这很费时间.

  if p_input3 ca '*/ + - ? ! % ( ) = 0123456789'.
    MESSAGE e000 WITH 'Only letters are allowed. No numbers or special characters'.
  ENDIF.
Run Code Online (Sandbox Code Playgroud)

有用.但我想用正则表达式来检查它.我试过这段代码.但它不能很好地工作.

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.
Run Code Online (Sandbox Code Playgroud)

有人能想出来吗?

Phi*_*ipp 11

首先,你的正则表达式将不起作用.只有当您的输入只包含一个字母时才会成功.

这个将正常工作:

'[a-zA-Z]*'
Run Code Online (Sandbox Code Playgroud)

然后,您将检查对匹配器对象本身的引用是否等于abap_true.这不会发生,因为它始终是对匹配器对象的引用,而不是abap_true或abap_false.

要获得匹配的结果,您不仅要创建匹配器,还要通过调用匹配方法来实际运行它.

IF matcher->match( ) = abap_false.
    MESSAGE e000 with 'Only letters are allowed. No numbers or special characters'.      
ENDIF. 
Run Code Online (Sandbox Code Playgroud)

但是使用+命令而不是类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.
Run Code Online (Sandbox Code Playgroud)

  • ^表示否定.所以[^ a-zA-Z]表示任何不在给定范围内的字符.+和*表示重复.这意味着属于前一类别的任意数量字符的链.区别在于*也可以表示0次,而+表示至少一次.所以空字符串匹配[az]*但不匹配[az] +. (3认同)
  • 当我在发布之后阅读我的回答时,请注意我刚刚对其进行了重大修改.它在第一个版本中犯了一些错误. (2认同)