---
schema_version: "1"
id: cf34553a334ff63eece3540b9c26bfed9e6b180bad8fd98dfc2d6a442ff6fbf9
title: match ステートメントを使用した DataWeave のパターン一致
collection: mulesoft
version: current
locale: ja-jp
portal_url: https://docs.salesforce.com/mulesoft/current/ja-jp/dataweave/2.6/dataweave-pattern-matching.md
canonical_url: https://docs.mulesoft.com/jp/dataweave/2.6/dataweave-pattern-matching
source_site: docs.mulesoft.com
content_type: documentation
content_hash: 3e8cebb6131ef481a22c5d3fbbcf7382009740552bb5176ef0b42e7f075538bb
description: MuleSoft Documentation Site
release: "2.6"
latest: false
---
# match ステートメントを使用した DataWeave のパターン一致

`match`​ ステートメントは、他の言語 (Java や C++ など) の ​`match`​ または ​`switch`​ ステートメントのように動作し、何らかの条件に基づいて入力式を特定の出力式にルーティングします。 開始する前に、Mule 4 アプリケーションでは DataWeave のバージョン 2.x が使用されることに注意してください。Mule 3 アプリケーションでの DataWeave については、​[DataWeave バージョン 1.2 のドキュメント](#1.2@dataweave::index.adoc)​を参照してください。 他の Mule バージョンの場合は、DataWeave の目次のバージョンセレクターを使用できます。

match ステートメントの構文:

```dataweave
inputExpression match {
  case <condition> -> <routing expression>
  case <condition> -> <routing expression>
  else -> <default routing expression>
}
```

他の言語と同様に、DataWeave の ​`match`​ ステートメントには、複数の連鎖した ​`if-else`​ ステートメントを整理するためのコンパクトな方法が用意されています。​`match`​ 式は、必要に応じて ​`else`​ ステートメントで終了する ​`case`​ ステートメントのリストで構成されます。 各 ​`case`​ ステートメントは、​`true`​ または ​`false`​ に評価されるセレクター条件式で構成されます。この条件式は ​`if`​ ステートメントで表される条件に対応します。その後に対応する DataWeave ルーティング式が続きます。この式には ​`match`​ ステートメントの入力式を含めることができます。

各 ​`case`​ ステートメントは ​`if`​ ステートメントにすることができます。また、​`case`​ ステートメントで他のパターン一致のショートカットを使用して、​`case`​ ステートメントの条件を定義することもできます。​`case`​ ステートメントが ​`false`​ の場合、ルーティング式は無視されます。

DataWeave では、​`case`​ ステートメントの条件として 4 つの種別のパターンがサポートされます。

- [式](#pattern_match_expressions)
- [リテラル値](#pattern_match_literals)
- [データ型](#pattern_match_data_types)
- [正規表現](#pattern_match_regex)

各 case に名前を付けても名前を付けなくても構いません。case に名前を付けると、その名前で入力式がローカル変数として保存され、その case ステートメントの条件式と、対応するルーティング式の両方で使用できるようになります。

match ステートメントの構造

```dataweave
value match {
  case (<name>:) <condition> -> <routing expression>
  case (<name>:) <condition> -> <routing expression>
  else -> <when none of them matched>
}
```

この例のように、式は最初に一致した ​`case`​ ステートメントの結果を返します。

match ステートメントの例

```dataweave
%dw 2.0
output application/json
---
"hello world" match {
	case word matches /(hello)\s\w+/ ->  word[1] as String ++ " was matched"
	case literalMatch: "hello world" -> upper(literalMatch)
	case hasOne if( hasOne is Object and hasOne.three? ) -> hasOne.three
	else -> $
}
```

出力

```json
"hello was matched"
```

入力式 ("hello world") は、各 ​`case`​ ステートメントのローカル変数名 (​`word`​ または ​`literalMatch`​) で参照できます。​`else`​ ステートメントの場合、デフォルトのパラメーター名 ​`$`​ (名前のないパラメーター) を使用して入力式を参照できます。

`else`​ ステートメントの入力式に名前を付けるには、​`else`​ ステートメントを常に ​`true`​ になる ​`case`​ ステートメントに置き換えます。

match ステートメントの例

```dataweave
%dw 2.0
output application/json
---
"hello world" match {
	case word matches  /(hello)\s\w+/ ->  word[1] ++ " was matched"
	case literalMatch: "hello world" -> upper(literalMatch)
	case last if(true) -> last
}
```

入力が String (文字列) 型のユースケースの場合、​`dw::Core`​ モジュールの ​[match](https://docs.mulesoft.com/jp/dataweave/2.6/dw-core-functions-match)​ ​_関数_​を使用して、正規表現パターンに対して文字列をテストすることもできます。この関数は、正規表現全体とキャプチャグループに一致する文字列を含む配列を返します。

文字列が正規表現パターンに一致するかどうかに基づいてブール値の結果が必要なユースケースの場合、パターン一致やモジュールの ​`match`​ 関数を使用する代わりに、​`dw::Core`​ モジュールの ​[matches](https://docs.mulesoft.com/jp/dataweave/2.6/dw-core-functions-matches)​ ​_関数_​を使用できます。

## [](#pattern_match_literals)リテラル値とのパターン一致

評価された値が単純なリテラル値に等しい場合に一致します。

次の例では、1 番目の項目で ​`myInput.string`​ の値と照合し、ブール値を返します。2 番目の項目では同じ照合が実行されますが、ブール値と、検証された値への参照の両方を含むオブジェクトを返します。

DataWeave スクリプト

```dataweave
%dw 2.0
var myInput = {
  "string": "Emiliano"
}
output application/json
---
{
  a: myInput.string match {
    case "Emiliano" -> true
    case "Mariano" -> false
  },
  b: myInput.string match {
    case str: "Emiliano" -> { "matches": true, value: str }
    case str: "Mariano" -> { "matches": false, value: str }
  }
}
```

出力

```json
{
  "a": true,
  "b": {
    "matches": true,
    "value": "Emiliano"
  }
}
```

## [](#pattern_match_expressions)式に対するパターン一致

提供された式が ​`true`​ を返す場合に一致します。

次の例では、1 番目の項目で ​`myInput.string`​ の値の 2 つの選択肢と照合し、条件に応じて別の文字列を追加します。2 番目の項目では、3 と比較して ​`myInput.number`​ の値が「より大」 (​`>`​)、「より小」 (​`<`​)、または「等しい」 (​`==`​) かどうかを評価し、対応する文字列を返します。

DataWeave スクリプト

```dataweave
%dw 2.0
var myInput = {
  "string": "Emiliano",
  "number": 3.14
}
output application/json
---
{
  a: myInput.string match {
    case str if str == "Mariano" -> str ++ " de Achaval"
    case str if str == "Emiliano" -> str ++ " Lesende"
  },
  b: myInput.number match {
    case num if num == 3 -> "equal"
    case num if num > 3 -> "greater than"
    case num if num < 3 -> "less than"
  }
}
```

出力

```json
{
  "a": "Emiliano Lesende",
  "b": "greater than"
}
```

## [](#pattern_match_data_types)データ型に対するパターン一致

評価された値が、指定されたデータ型の場合に一致します。

次の例では、1 番目の項目で ​`myInput.a`​ のデータ型を評価し、対応する型名の文字列を返します。2 番目の項目でも同様ですが、​`myInput.b`​ の値も返します。

DataWeave スクリプト

```dataweave
%dw 2.0
var myInput =
{
  "a": "Emiliano",
  "b": 3.14
}
output application/json
---
{
  a: myInput.a match {
    case is Object -> 'OBJECT'
    case is String -> 'STRING'
    case is Number -> 'NUMBER'
    case is Boolean -> 'BOOLEAN'
    case is Array -> 'ARRAY'
    case is Null -> 'NULL'
    else -> 'ANOTHER TYPE'
  },
  b: myInput.b match {
    case y is Object -> { 'Type': { 'OBJECT' : y} }
    case y is String -> { 'Type': { 'STRING' : y} }
    case y is Number -> { 'Type': { 'NUMBER' : y} }
    case y is Boolean -> { 'Type': { 'BOOLEAN' : y} }
    case y is Array -> { 'Type': { 'ARRAY' : y} }
    case y is Null -> { 'Type': { 'NULL' : y} }
    else -> { 'Type': { 'ANOTHER TYPE' : myInput.b} }
  }
}
```

出力

```json
{
  "a": "STRING",
  "b": {
    "Type": {
      "NUMBER": 3.14
    }
  }
}
```

## [](#pattern_match_regex)正規表現に対するパターン一致

評価された値が、提供された正規表現 (具体的には Java でサポートされる正規表現の「フレーバー」) に適合する場合に一致します。次の例では、入力変数 (​`myInput`​) に文字列の配列が含まれます。スクリプトは ​`map`​ 関数を使用して配列を反復処理します。Java 正規表現に対して各要素を評価し、入力との一致に基づいてオブジェクトを出力します。

DataWeave スクリプト

```dataweave
%dw 2.0
var myInput = {
  "phones": [
    "+1 (415) 229-2009",
    "(647) 456-7008"
  ]
}
output application/json
---
{
  a: myInput.phones map ($ match {
     case phone matches /\+(\d+)\s\((\d+)\)\s(\d+\-\d+)/ -> { country: phone[1]}
     case phone matches /\((\d+)\)\s(\d+\-\d+)/ -> { area: phone[1], number: phone[2] }
   }),
 b: myInput.phones map ($ match {
   case phone matches /\+(\d+)\s\((\d+)\)\s(\d+\-\d+)/ -> { country: phone[1], area: phone[2], number: phone[3] }
   case phone matches /\((\d+)\)\s(\d+\-\d+)/ -> { area: phone[1], number: phone[2] }
 })
}
```

出力

```json
{
  "a": [
    {
      "country": "1"
    },
    {
      "area": "647",
      "number": "456-7008"
    }
  ],
  "b": [
    {
      "country": "1",
      "area": "415",
      "number": "229-2009"
    },
    {
      "area": "647",
      "number": "456-7008"
    }
  ]
}
```

## [](#dataweave-でのコレクションのデコンストラクター)DataWeave でのコレクションのデコンストラクター

DataWeave は、配列とオブジェクトの 2 つの種別のコレクションをサポートしています。配列は値のシーケンスで、オブジェクトはキー-値ペアのシーケンスです。

### [](#配列の分解)配列の分解

配列は、ヘッド (配列の最初の要素) とテール (残りの要素を含む新しい配列) とみなすことができます。たとえば、配列 ​`[1,2,3,4]`​ では、​`1`​ がヘッドで、​`2,3,4`​ がテールです。

配列を照合するには、次の構文を使用します。このスクリプトは、配列の最初の要素を取得するか、配列が空の場合は null を返します。

DataWeave スクリプト

```dataweave
[1,2,3,4] match {
	case [head ~ tail] -> head
	case [] -> null
}
```

このような分解は、再帰的関数で使用する場合に役立ちます。

#### [](#例-joinby-関数の構築)例: `joinBy`​ 関数の構築

この例では、文字列の配列を取得し、指定された区切り文字で連結された配列のすべての要素を含む文字列を返す ​`joinBy`​ 関数を構築します。

DataWeave スクリプト

```dataweave
fun joinBy(elements: Array<String>, separator: String): String =
	elements match {
		case [head ~ tail] -> head ++ separator ++ joinBy(tail, separator) //When head and tail append and recursively
		case [] -> "" //When the array is empty return empty array
	}
```

#### [](#例-filter-関数の構築)例: filter 関数の構築

この例では、高次 filter 関数を構築します。

DataWeave スクリプト

```dataweave
fun filter<T>(elements: Array<T>, predicate: (item:T) -> Boolean): Array<T> =
	elements match {
		case [head ~ tail] ->
			if(predicate(head))
				[head] ++ filter(tail, predicate)
			else
				filter(tail, predicate)
		case [] -> []
	}
```

### [](#オブジェクトの分解)オブジェクトの分解

DataWeave のオブジェクトは配列に似ていますが、各要素はキーと値で構成されます。オブジェクトも、ヘッド (最初のキー-値ペア) とテール (残りのキー-値ペアを含む新しいオブジェクト) としてみなすことができます。

オブジェクトを照合するには、次の構文を使用します。このスクリプトは、オブジェクトの最初の値 (この場合は「Word」) を取得します。

DataWeave スクリプト

```dataweave
{hello: "world", test: true} match {
    case {headKey: headValue ~ tail} -> headValue
    case {} -> null
}
```

## [](#関連情報)関連情報

- [DataWeave の型](https://docs.mulesoft.com/jp/dataweave/2.6/dataweave-types)
- [DataWeave セレクター](https://docs.mulesoft.com/jp/dataweave/2.6/dataweave-selectors)
- [DataWeave クイックスタート](https://docs.mulesoft.com/jp/dataweave/2.6/dataweave-quickstart)