&& 演算子による文字列連結および文字列テンプレートを使用した書式設定に加えて、ABAP にはさまざまな組込文字列関数が用意されています。結果のタイプに基づいて、文字列関数の 3 つのカテゴリを区別します。
注記
Objectives
&& 演算子による文字列連結および文字列テンプレートを使用した書式設定に加えて、ABAP にはさまざまな組込文字列関数が用意されています。結果のタイプに基づいて、文字列関数の 3 つのカテゴリを区別します。
注記
一部の組込文字列関数では、入力は 1 つの文字型データオブジェクトのみで構成されます。これらの関数では、入力パラメータは使用されません。入力は括弧内で直接指定されます。説明関数 NUMOFCHAR( ) は、これらのタイプの関数の良い例です。

複数の入力がある関数では、名前の付いたパラメータが使用され、入力がこれらのパラメータに割り当てられます。多くのパラメータは、さまざまな組み込み文字列関数の共通点です。最も重要なパラメータは以下のとおりです。
関数で処理されるテキスト文字列をパラメータ val に渡します。また、戻り値が文字列型に変換可能な関数メソッド呼び出し、テーブル式、コンストラクタ式を指定することもできます。基本データ型のみを処理できます。固定長の文字型データオブジェクトが指定されている場合、末尾の空白は無視されます。非文字型の戻り値は、文字列データ型に変換されます。
パラメータ sub は、文字を検索または挿入する文字列を渡すために使用されます。基本データ型の引数のみを指定できます。固定長の文字型データオブジェクトが指定されている場合、末尾の空白は無視されます。
文字列関数での検索と比較では、デフォルトで大文字と小文字が区別されますが、パラメータの大文字と小文字を使用して、必要に応じてこれを上書きすることができます。パラメータ case には、定数 abap_true ('X') または abap_false (' ') の値を含む型 abap_bool (C LENGTH 1) の入力が必要です。case に abap_true の値が含まれている場合、検索では大文字と小文字が区別され、abap_false の値が含まれている場合は区別されません。
検索が実行される文字列関数では、パラメータ occ によって一致の発生が指定されます。occ がプラスの場合、発生は左側からカウントされます。occ がマイナスの場合、発生は右側からカウントされます。値 1、2、.... は、1 回目、2 回目、... の発生を示します。値 -1、-2、.... は、最後の、最後から 2 番目の発生を示します。occ のデフォルト値は 1 です。
注記
パラメータ off はオフセットを渡し、パラメータ len は長さを渡すために使用されます。off と len の両方を渡すことができる関数では、文字列が処理されるサブエリアが決定されます。
通常、off のデフォルト値は 0 で、len のデフォルト値は offset の後の文字列全体の長さに設定されます。
注記
これらのパラメータの影響については、いくつかの例を見てみましょう。
12345678910111213141516171819
DATA text TYPE string VALUE ` Let's talk about ABAP `.
DATA result TYPE i.
out->write( text ).
result = find( val = text sub = 'A' ).
*
* result = find( val = text sub = 'A' case = abap_false ).
*
* result = find( val = text sub = 'A' case = abap_false occ = -1 ).
* result = find( val = text sub = 'A' case = abap_false occ = -2 ).
* result = find( val = text sub = 'A' case = abap_false occ = 2 ).
*
* result = find( val = text sub = 'A' case = abap_false occ = 2 off = 10 ).
* result = find( val = text sub = 'A' case = abap_false occ = 2 off = 10 len = 4 ).
out->write( |RESULT = { result } | ).

文字列に対する記述関数の重要なグループは、長さ関数 NUMOFCHAR( ) および STRLEN( ) です。ほとんどの場合、2 つの関数は同じ結果を返します。ただし、例外が 1 つあります。引数の型が string で、末尾に 1 つ以上の空白が含まれている場合、STRLEN( ) の結果にはこれらの後続ブランクが含まれますが、NUMOFCHAR( ) では無視されます。固定長の引数 (たとえば、引数が TYPE C または N) の場合、どちらの関数も末尾の空白を無視します。
文字列の検索機能には、以下の 2 つのグループがあります。
関数 COUNT( ) および COUNT_...( ) で始まる関数は、検索引数の出現回数の合計を返します。関数 FIND( ) および FIND_( ) で始まる関数は、検索引数の特定のオカレンスの位置 (オフセット) を返します。
関数 COUNT( ) および FIND( ) では、部分文字列 (オプションパラメータ sub) または正規表現 (オプションパラメータ pcre) のいずれかを検索することができます。正規表現については、このコースの後半で説明します。
_ANY_OF で終わる関数の場合、パラメータ sub の名称は少し誤解を招きます。ここで、パラメータ sub の値は部分文字列ではなく、文字の一覧です。これらの関数は、部分文字列 (つまり、文字の正確な組合せ) を検索するのではなく、個々の文字を評価し、各文字が提供された一覧に含まれる一致であるとみなします。_ANY_NOT_OF で終わる関数も同様に機能しますが、ここでは一覧のすべての文字とは異なる文字のみが一致と見なされます。
説明関数の例をいくつか見てください。
1234567891011121314151617181920212223242526
DATA result TYPE i.
DATA text TYPE string VALUE ` ABAP `.
DATA substring TYPE string VALUE `AB`.
DATA offset TYPE i VALUE 1.
* Call different description functions
******************************************************************************
* result = strlen( text ).
* result = numofchar( text ).
result = count( val = text sub = substring off = offset ).
* result = find( val = text sub = substring off = offset ).
* result = count_any_of( val = text sub = substring off = offset ).
* result = find_any_of( val = text sub = substring off = offset ).
* result = count_any_not_of( val = text sub = substring off = offset ).
* result = find_any_not_of( val = text sub = substring off = offset ).
out->write( |Text = `{ text }`| ).
out->write( |Substring = `{ substring }` | ).
out->write( |Offset = { offset } | ).
out->write( |Result = { result } | ).
処理機能の詳細については、以下のビデオを視聴してください。
ヒント

いくつかの文字列処理関数の結果を示すために、いくつかの例を見てみましょう。
12345678910111213141516171819202122232425262728293031323334353637
DATA text TYPE string VALUE ` SAP BTP, ABAP Environment `.
* Change Case of characters
**********************************************************************
out->write( |TO_UPPER = { to_upper( text ) } | ).
out->write( |TO_LOWER = { to_lower( text ) } | ).
out->write( |TO_MIXED = { to_mixed( text ) } | ).
out->write( |FROM_MIXED = { from_mixed( text ) } | ).
* Change order of characters
**********************************************************************
out->write( |REVERSE = { reverse( text ) } | ).
out->write( |SHIFT_LEFT (places)= { shift_left( val = text places = 3 ) } | ).
out->write( |SHIFT_RIGHT (places)= { shift_right( val = text places = 3 ) } | ).
out->write( |SHIFT_LEFT (circ) = { shift_left( val = text circular = 3 ) } | ).
out->write( |SHIFT_RIGHT (circ) = { shift_right( val = text circular = 3 ) } | ).
* Extract a Substring
**********************************************************************
out->write( |SUBSTRING = { substring( val = text off = 4 len = 10 ) } | ).
out->write( |SUBSTRING_FROM = { substring_from( val = text sub = 'ABAP' ) } | ).
out->write( |SUBSTRING_AFTER = { substring_after( val = text sub = 'ABAP' ) } | ).
out->write( |SUBSTRING_TO = { substring_to( val = text sub = 'ABAP' ) } | ).
out->write( |SUBSTRING_BEFORE= { substring_before( val = text sub = 'ABAP' ) } | ).
* Condense, REPEAT and Segment
**********************************************************************
out->write( |CONDENSE = { condense( val = text ) } | ).
out->write( |REPEAT = { repeat( val = text occ = 2 ) } | ).
out->write( |SEGMENT1 = { segment( val = text sep = ',' index = 1 ) } | ).
out->write( |SEGMENT2 = { segment( val = text sep = ',' index = 2 ) } | ).

述部関数 CONTAINS( ) は、指定された部分文字列が入力文字列に少なくとも 1 回出現する場合は true です。つまり、CONTAINS( ) が true の場合、関数 COUNT( ) は 0 より大きい結果を返します。
述部関数 CONTAINS_ANY_OF( ) と CONTAINS_ANY_NOT_OF( ) と、対応する記述関数 COUNT_ANY_OF( ) と COUNT_ANY_NOT_OF( ) の間には、同じ関係が存在します。
MATCHES( ) は、入力文字列全体を正規表現と比較するための専用の述部関数です。正規表現については、次のセクションで説明します。
正規表現 (略して Regex) は、一連の文字列を記述するリテラル文字と特殊文字のパターンです。正規表現は、多くの場合、テキスト検索、"検索と置換" 操作、または文字型項目の内容のチェックに使用されます。正規表現を使用する検索は、単純な文字列を検索するよりも強力です。正規表現は、多数の (潜在的に無限の) 文字列を表し、同時に検索するためです。

正規表現の構文は広く標準化されていますが、Perl や POSIX などの一般的な標準と、XPath や XSD 正規表現などの異なる構文のフレーバには違いがあります。
ABAP では、Perl Compatible Regular Expression (PCRE) が推奨される標準ですが、ABAP では他の標準およびフレーバもサポートされています。
注記

正規表現の例をいくつか見てみましょう。
注記
多くの組み込み文字列関数は、特に検索の実行時にパラメータ pcre を提供します。多くの場合、Pcre はパラメータサブの代替です。一連の文字をパラメータ pcre に渡すと、関数は入力を Perl 互換正規表現 (PCRE) として解釈し、このパターンに一致するサブ文字列を検索します。関数にパラメータ sub と pcre の両方がある場合は、そのうちの 1 つのみを指定できます。

注記
FIND( ) や COUNT( ) などの関数では、部分文字列の検索を実行することが明らかです。ただし、他の機能でも検索が実行されます。例として、述部関数 CONTAINS( ) や処理関数 REPLACE( )、SUBSTRING_FROM( )、SUBSTRING_AFTER( ) などがあります。
また、正規表現のみを使用する組み込み文字列関数もあります。完全な文字列が正規表現と一致する場合、述部関数 MATCHES( ) は true です。MATCH( ) は FIND( ) と同様に機能します。文字列内で、正規表現に一致する部分文字列が検索されます。ただし、FIND( ) は検索のオフセットを返し、MATCH( ) は見つかった部分文字列を返します。
このビデオでは、パラメータ PCRE を使用したいくつかの例について説明します。
注記
この演習問題では、文字列処理機能を使用して、テキストシンボルを変数の内容で拡張してから、それらをコンソール出力に追加します。