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

まず、正規表現が機能しません。入力に ​​1 文字しか含まれていない場合にのみ成功します。

これは正しく動作します:

'[a-zA-Z]*'

+*意味の繰り返し。これは、前のカテゴリに分類される任意の数の文字のチェーンを意味します。違いは、* は 0 回を意味することもあり、+ は少なくとも 1 回を意味することです。したがって、空の文字列は一致しますが、一致[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.

^否定を意味します。so[^a-zA-Z]は、指定された範囲にない任意の文字を意味します。

于 2012-09-14T09:10:17.703 に答える