【问题标题】:Verify that string contains only letters验证字符串仅包含字母
【发布时间】:2012-09-07 09:43:08
【问题描述】:

我有一个只能接受字母的输入字段(不管是小写还是大写)。 我可以简单地通过使用 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.

有谁知道吗?

【问题讨论】:

    标签: regex abap matcher


    【解决方案1】:

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

    这个可以正常工作:

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

    【讨论】:

    • 当您在我发布答案后阅读我的答案时,请注意我刚刚对其进行了重大修改。它在第一个版本中犯了一些错误。
    • 谢谢。有用。但是这些正则表达式括号内的 * 或 ^ 是什么意思。在互联网上,我也看到过一些带有 w+ 的内容。你能解释一下他们的意思吗?谢谢。
    • ^ 表示否定。所以 [^a-zA-Z] 表示不在给定范围内的任何字符。 + 和 * 表示重复。这意味着属于上述类别的任意数量的字符链。不同之处在于 * 也可以表示 0 次,而 + 表示至少一次。因此,空字符串将匹配 [a-z]* 但不匹配 [a-z]+。
    • 谢谢。还有一个问题。 '([0-9]{1,3}\.[0-9]{1,2})'
    • 我没有测试它,但它看起来是正确的。如果您有任何其他问题,请打开一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    相关资源
    最近更新 更多