ABAP regex: cadena contiene solo letras

Tengo un campo de entrada que se debe aceptar sólo letras (no importa mayúsculas o minúsculas).
Yo podría escribir esto simplemente mediante el uso de co ca (sólo contiene/cualquier operador. Pero es desperdiciador de tiempo.

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

Funciona. Pero quería comprobar que el uso de expresiones regulares.
He probado este código. Pero no funciona muy bien.

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.

Alguien podría averiguar?

InformationsquelleAutor kk-dev11 | 2012-09-14

1 Kommentar

  1. 10

    Primero, la expresión regular no funciona. Es éxito sólo cuando su entrada contiene una sola carta.

    Ésta funcionará correctamente:

    '[a-zA-Z]*'

    + y * significa la repetición. Eso significa que una cadena de cualquier número de caracteres que cae en la anterior categoría. La diferencia es que * también puede significar 0 veces, mientras que + significa que al menos una vez. Así que una cadena vacía podría coincidir con el [a-z]* pero no [a-z]+

    A continuación, compruebe la referencia a la comparador objeto en sí mismo para ser igual a abap_true. Esto no sucediera, porque va a ser siempre una referencia a un combinador de objeto, no abap_true o abap_false.

    Para obtener el resultado de un partido, usted tiene que no sólo crear el comparador pero en realidad ejecuta llamando a su método match.

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

    Pero también hay una manera mucho más fácil hacer esto con el FIND REGEX de comandos en lugar de la clase 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.

    ^ significa negación. Así [^a-zA-Z] significa cualquier carácter que NO está en el rango dado.

    • Cuando usted lee mi respuesta después de lo publicado, por favor, tenga en cuenta que acabo de hacer importantes modificaciones. Hizo algunos errores de la primera versión.
    • gracias. Funciona. Pero, ¿qué significa * o ^ dentro de las expresiones entre paréntesis. En Internet también he visto algunos con w+. Podría usted por favor me explique lo que significan? gracias.
    • ^ significa negación. Así que [^a-zA-Z] significa cualquier carácter que NO está en el rango dado. + y * significa la repetición. Eso significa que una cadena de cualquier número de caracteres que cae en la anterior categoría. La diferencia es que * también puede significar 0 veces, mientras que + significa que al menos una vez. Así que una cadena vacía coincidiría con [a-z]* pero no [a-z]+.
    • Gracias. Una pregunta más. ‘([0-9]{1,3}\.[0-9]{1,2})’ <– quiero tener un número menor que 1000 con al menos 1 punto decimal o un máximo de 2. Es ese derecho?
    • Yo no prueba, pero nos parece correcto. Por favor, abra una nueva pregunta cuando usted tiene cualquier pregunta adicional.
    • Que bien. Escribí como este ‘^([0-9]{1,3}\.[0-9]{1,2})$’. Luego se trabajó.
    • Un número con dos decimales suena como moneda. Cómo sobre el uso de una gran cantidad de datos (tipo P) y, a continuación, comprobar que es menor que 1000? Que la expresión regular enfoque podría ser bastante engorroso cuando los trajes de decidir que quieren cambiar el límite superior de 1250 $o $750.
    • Sería un muy buen enfoque. Pero Es un ejercicio que tengo que hacer con el campo de entrada y regex.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea