3

我有一个输入字段,它应该只接受字母(不管是小写还是大写)。我可以简单地通过使用 co ca (contains only/any) 运算符来编写这个。但这很耗时。

  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.

有人能弄清楚吗?

4

1 回答 1

11

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

这将正常工作:

'[a-zA-Z]*'

+并且*意味着重复。这意味着属于上述类别的任意数量的字符链。不同之处在于 * 也可以表示 0 次,而 + 表示至少一次。所以空字符串会匹配[a-z]*但不匹配[a-z]+

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

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

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]表示不在给定范围内的任何字符。

于 2012-09-14T09:10:17.703 回答