在 ABAP 中判断字符串是否包含某个值,有以下几种方法:
一、常用方法对比
| 运算符/语句 | 用途 | 区分大小写 | 支持通配符 | 示例 |
|---|---|---|---|---|
CS | 包含字符串 | 否 | 否 | 'ABC' CS 'B' → 真 |
CA | 包含任意字符 | 否 | 否 | 'ABC' CA 'XB' → 真(含 B) |
CP | 包含模式(模糊) | 否 | 是(* +) | 'ABC' CP '*B*' → 真 |
CO | 仅包含(全匹配) | 否 | 否 | 'ABC' CO 'ABC' → 真 |
CN | 不包含 | 否 | 否 | 'ABC' CN 'D' → 真 |
NA | 不包含任意字符 | 否 | 否 | 'ABC' NA 'XYZ' → 真 |
NP | 不匹配模式 | 否 | 是 | 'ABC' NP '*D*' → 真 |
FIND | 查找子串位置 | 可选 | 否 | 功能最强大 |
SEARCH | 查找子串 | 否 | 是(*) | 老语法 |
二、具体用法
1. CS(Contains String)最常用
判断字符串是否包含某个子串,不区分大小写。
DATA: LV_STR TYPE STRING VALUE '山纹樱桃柜身'.
IF LV_STR CS '樱桃'.
WRITE '包含"樱桃"'. " ← 会执行
ENDIF.
IF LV_STR CS '櫻桃'.
WRITE '包含"櫻桃"'. " ← 也会执行(不区分大小写)
ENDIF.
IF LV_STR CS '胡桃'.
WRITE '包含"胡桃"'. " ← 不会执行
ENDIF.
2. CA(Contains Any)包含任意字符
判断字符串中是否至少包含指定字符中的任意一个。
DATA: LV_STR TYPE STRING VALUE 'ABC123'.
IF LV_STR CA 'XYZ'.
WRITE '包含X/Y/Z中的某个'. " ← 不会执行
ENDIF.
IF LV_STR CA 'XBY'.
WRITE '包含X/B/Y中的某个'. " ← 会执行(含 B)
ENDIF.
3. CP(Contains Pattern)模式匹配
支持通配符:* 代表任意多个字符,+ 代表任意单个字符。
DATA: LV_STR TYPE STRING VALUE '山纹樱桃柜身'.
IF LV_STR CP '*樱桃*'.
WRITE '包含"樱桃"'. " ← 会执行
ENDIF.
IF LV_STR CP '山纹+'.
WRITE '以"山纹"开头,后跟一个字符'. " ← 不会执行(+只匹配一个字符)
ENDIF.
IF LV_STR CP '山纹*'.
WRITE '以"山纹"开头'. " ← 会执行
ENDIF.
注意:
CP中的特殊字符(*+#)如果要在模式中当作普通字符,需要用#转义,如##表示#。
4. FIND 语句(最灵活)
可以获取位置、区分大小写、正则表达式等。
DATA: LV_STR TYPE STRING VALUE '山纹樱桃柜身'.
" 基本查找
FIND '樱桃' IN LV_STR.
IF SY-SUBRC = 0.
WRITE '找到了'. " ← 会执行
ENDIF.
" 获取位置
FIND '樱桃' IN LV_STR MATCH OFFSET DATA(LV_OFF).
WRITE: / '位置:', LV_OFF. " 输出:4(从0开始)
" 区分大小写
FIND '櫻桃' IN LV_STR IGNORING CASE.
IF SY-SUBRC = 0.
WRITE '不区分大小写找到了'.
ENDIF.
" 正则表达式
FIND REGEX '樱.*' IN LV_STR.
IF SY-SUBRC = 0.
WRITE '正则匹配成功'.
ENDIF.
5. SEARCH(老语法)
DATA: LV_STR TYPE STRING VALUE '山纹樱桃柜身'.
SEARCH LV_STR FOR '樱桃'.
IF SY-SUBRC = 0.
WRITE '找到了'.
ENDIF.
" 支持通配符 *
SEARCH LV_STR FOR '*樱桃*'.
SEARCH功能弱于FIND,且 SAP 官方推荐用FIND替代。

6996

被折叠的 条评论
为什么被折叠?



