regex - 验证字符串只包含字母

标签 regex abap matcher

我有一个应该只接受字母的输入字段(大小写无关紧要)。
我可以简单地使用 co ca (仅包含/任何)运算符来编写它。但是很费时间。

  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.

有人能弄清楚吗?

最佳答案

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

这将正常工作:

'[a-zA-Z]*'
+*重复的意思。这意味着属于上述类别的任意数量字符的链。不同之处在于*也可以表示0次,而+表示至少一次。所以空字符串将匹配 [a-z]*但不是 [a-z]+
然后,您正在检查对匹配器对象本身的引用是否等于 abap_true。这永远不会发生,因为它始终是对匹配器对象的引用,而不是 abap_true 或 abap_false。

要获得匹配结果,您不仅要创建匹配器,还要通过调用它的 match 方法实际运行它。
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]表示不在给定范围内的任何字符。

关于regex - 验证字符串只包含字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12420898/

相关文章:

regex - 在 bash 中选择字符串中的所有单词对

java - 正则表达式是否足够,或者我需要检查编码吗?

PHP preg_split 按组 1 分割

javascript - 正则表达式完全匹配数字,而不是数字

abap - 整数的 IS INITIAL 和 = 0 之间有什么区别?

abap - ABAP 直升机 View

methods - abap多方法调用

javascript - Jest : expect object not to have property

Java 模式匹配器错误匹配的子字符串

Java Split 没有按预期工作