대화 상자용 표현 언어 메서드
사용자가 말한 내용에서 추출된 값을 컨텍스트 변수, 조건, 또는 응답의 다른 곳에서 참조할 수 있습니다.
표현식 구문을 사용할 수 있는 위치
다른 변수 내에서 변수 값을 확장하거나 메소드를 출력 텍스트 또는 컨텍스트 변수에 적용하려면 <? expression ?> 표현식 구문을 사용하십시오. 예를 들어, 다음과 같습니다.
-
대화 노드 텍스트 응답에서 사용자 입력 참조
You said <? input.text ?>. -
JSON 편집기에서 숫자 특성 증분
"output":{"number":"<? output.number + 1 ?>"} -
대화 노드 조건에서 특정 엔티티 값 확인
@city.toLowerCase() == 'paris' -
대화 노드 응답 조건에서 특정 날짜 범위 확인
@sys-date.after(today()) -
컨텍스트 편집기에서 컨텍스트 변수 배열에 요소 추가
| 컨텍스트 변수 이름 | 컨텍스트 변수 값 |
|---|---|
toppings |
<? context.toppings.append( 'onions' ) ?> |
대화 노드 조건 및 대화 노드 응답 조건에서도 SpEL 표현식을 사용할 수 있습니다.
노드 조건에서 SpEL 표현식을 사용하는 경우 주변 <? ?> 구문이 필요하지 않습니다.
다음 섹션에서는 값을 처리하는 데 사용할 수 있는 방법을 설명합니다. 메소드는 데이터 유형별로 구성됩니다.
배열
배열 값을 설정하는 동일한 노드 내 노드 조건 또는 응답 조건에서 배열의 값을 검사하는 데 다음 메소드를 사용할 수 없습니다.
JSONArray.addAll(JSONArray)
이 메소드는 한 배열을 다른 배열에 추가합니다.
이 대화 상자 런타임 컨텍스트의 경우:
{
"context": {
"toppings_array": ["onion", "olives"],
"more_toppings": ["mushroom","pepperoni"]
}
}
이 업데이트를 작성하십시오.
{
"context": {
"toppings_array": "<? $toppings_array.addAll($more_toppings) ?>"
}
}
결과: 메소드 자체가 null 항목을 리턴합니다. 그러나, 두 번째 배열의 값을 포함하기 위해 첫 번째 배열이 업데이트됩니다.
{
"context": {
"toppings_array": ["onion", "olives", "mushroom", "pepperoni"]
}
}
JSONArray.append(object)
이 메소드는 JSONArray에 새 값을 추가하고 수정된 JSONArray를 리턴합니다.
이 대화 상자 런타임 컨텍스트의 경우:
{
"context": {
"toppings_array": ["onion", "olives"]
}
}
이 업데이트를 작성하십시오.
{
"context": {
"toppings_array": "<? $toppings_array.append('ketchup', 'tomatoes') ?>"
}
}
결과:
{
"context": {
"toppings_array": ["onion", "olives", "ketchup", "tomatoes"]
}
}
JSONArray.clear()
이 메소드는 배열에서 모든 값을 지우고 널을 리턴합니다.
출력에서 다음 표현식을 사용하여 해당 값의 컨텍스트 변수($toppings_array)에 저장한 배열을 지우는 필드를 정의합니다.
{
"output": {
"array_eraser": "<? $toppings_array.clear() ?>"
}
}
그런 다음, $toppings_array 컨텍스트 변수를 참조하면 ' [] '만 반환됩니다.
JSONArray.contains(Object value)
이 메소드는 입력 JSONArray에 입력 값이 포함되어 있는 경우 true를 리턴합니다.
이 대화 상자의 런타임 컨텍스트는 이전 노드 또는 외부 응용 프로그램에 의해 설정됩니다
{
"context": {
"toppings_array": ["onion", "olives", "ham"]
}
}
대화 노드 또는 응답 조건:
$toppings_array.contains('ham')
결과: 배열에 ham 요소가 포함되어 있으므로 true입니다.
JSONArray.containsIgnoreCase(오브젝트 값)
이 메소드는 값이 대문자 또는 소문자로 지정되는지 여부에 관계없이 입력 JSONArray에 입력 값이 포함되어 있는 경우 true 항목을 리턴합니다.
이 대화 상자의 런타임 컨텍스트는 이전 노드 또는 외부 응용 프로그램에 의해 설정됩니다
{
"context": {
"toppings_array": ["onion", "olives", "ham"]
}
}
대화 노드 또는 응답 조건:
$toppings_array.containsIgnoreCase('HAM')
결과: 배열에 ham 요소가 포함되어 있고 케이스가 무시되므로 true입니다.
JSONArray.containsIntent(String intent_name, Double min_score, [Integer top_n])
이 메소드는 true JSONArray가 지정된 인텐트를 특별히 포함하고 해당 인텐트의 신뢰도 점수가 지정된 최소 점수 이상인 경우 그러한 인텐트가 지정된 최소 점수와 같거나 높은 신뢰도 점수를 갖는 경우에 intents를 리턴합니다. 선택적으로 배열의 최상위 요소 개수 내에 인텐트가 포함되어야 함을 표시하도록 숫자를 지정할 수 있습니다. 음수를 지정하면 top_n 매개변수가 무시됩니다.
지정된 인텐트가 배열에 없는 경우, 최소 신뢰도 점수 이상인 신뢰도 점수가 없는 경우 또는 인텐트의 배열 인덱스가 지정된 인덱스 위치보다 낮은 경우, false를 리턴합니다.
서비스는 사용자 입력이 제출될 때마다 서비스가 입력에서 발견하는 인텐트를 나열하는 intents 배열을 자동으로 생성합니다. 이 배열은 서비스에서 발견되는 모든 인텐트를 가장 높은 신뢰도 순서로 나열합니다.
노드 조건에서 이 메소드를 사용하여 인텐트의 존재 여부를 확인할 뿐만 아니라, 노드가 처리되고 응답이 리턴되기 전에 충족해야 하는 신뢰도 점수 임계값을 설정할 수 있습니다.
예를 들어, 다음 조건이 충족되는 경우에만 대화 노드를 트리거할 때 노드 조건에서 다음 표현식을 사용하십시오.
#General_Ending인텐트가 있습니다.#General_Ending의사의 신뢰도 점수가 80%를 초과합니다.#General_Ending인텐트가 인텐트 배열의 상위 2번째 인텐트입니다.
intents.containsIntent("General_Ending", 0.8, 2)
JSONArray.filter(temp, "temp.property operator comparison_value")
각 배열 요소 값을 사용자가 지정하는 값과 비교하여 배열을 필터링합니다. 이 메소드는 콜렉션 투영법(collection projection)과 유사합니다. 콜렉션 투영법은 배열 요소 이름-값 쌍의 이름을 기반으로 필터링된 배열을 리턴합니다. 필터 메소드는 배열 요소 이름-값 쌍의 값을 기반으로 필터링된 배열을 리턴합니다.
필터 표현식은 다음 값으로 구성됩니다.
-
temp: 각 배열 요소가 평가될 때 임시로 사용되는 변수의 이름입니다. 예를 들어,city입니다. -
property:comparison_value와 비교할 요소 특성입니다. 첫 번째 매개변수에서 이름을 지정하는 임시 변수의 특성으로 특성을 지정하십시오.temp.property구문을 사용하십시오. 예를 들어,latitude가 배열의 이름-값 쌍에 올바른 요소 이름인 경우, 특성을city.latitude로 지정합니다. -
operator: 특성 값과comparison_value를 비교하는 데 사용할 연산자입니다.지원되는 연산자는 다음과 같습니다.
지원되는 필터 연산자 운영자 설명 ==같음 >초과함 <미만임 >=크거나 같음 <=작거나 같음 !=같지 않음 -
comparison_value: 각각의 배열 요소 특성 값을 비교할 값입니다. 사용자 입력에 따라 변경할 수 있는 값을 지정하려면 컨텍스트 변수 또는 엔티티를 값으로 사용하십시오.comparison_value변할 수 있는 값을 지정하는 경우, 평가 시에 유효한 값이 입력되었는지 확인하는 로직을 추가하거나 오류가 발생하도록 하십시오.
필터 예제 1
예를 들어, 필터 메소드를 사용하여 인구가 500만이 넘는 도시를 포함하는 더 작은 배열을 리턴하도록 구/군/시 이름 및 해당 인구수 세트를 포함하는 배열을 평가할 수 있습니다.
다음 $cities 컨텍스트 변수에는 오브젝트 배열이 포함되어 있습니다. 각 오브젝트에는 name 및 population 특성이 포함되어 있습니다.
[
{
"name":"Tokyo",
"population":9273000
},
{
"name":"Rome",
"population":2868104
},
{
"name":"Beijing",
"population":20693000
},
{
"name":"Paris",
"population":2241346
}
]
다음 예제에서 임의의 임시 변수 이름은 city입니다. SpEL 표현식은 인구 5백만 이상의 도시만 포함하도록 $cities 배열을 필터링합니다.
$cities.filter("city", "city.population > 5000000")
이 표현식은 다음과 같은 필터링된 배열을 리턴합니다.
[
{
"name":"Tokyo",
"population":9273000
},
{
"name":"Beijing",
"population":20693000
}
]
컬렉션 투영을 사용하면 필터 메서드에 의해 반환된 배열의 도시 이름만 포함하는 새로운 배열을 만들 수 있습니다. 그런 다음 join 메소드를 사용하여 배열에서 두 개의 이름 요소 값을 문자열로 표시하고 값을 쉼표와 공백으로 구분할 수 있습니다.
The cities with more than 5 million people include <? T(String).join(", ",($cities.filter("city", "city.population > 5000000")).![name]) ?>.
결과 응답은 The cities with more than 5 million people include Tokyo, Beijing.입니다.
필터 예제 2
필터 방식의 장점은 comparison_value 값을 하드코딩할 필요가 없다는 것입니다. 이 예제에서는 하드코딩된 값 5000000이 대신 컨텍스트 변수로 대체됩니다.
이 예제에서는 $population_min 컨텍스트 변수에 5000000이 포함됩니다. 임의의 임시 변수 이름은 city입니다. SpEL 표현식은 인구 5백만 이상의 도시만 포함하도록 $cities 배열을 필터링합니다.
$cities.filter("city", "city.population > $population_min")
이 표현식은 다음과 같은 필터링된 배열을 리턴합니다.
[
{
"name":"Tokyo",
"population":9273000
},
{
"name":"Beijing",
"population":20693000
}
]
숫자 값을 비교할 때, 필터 메소드가 트리거되기 전에 비교에 관련된 컨텍스트 변수를 올바른 값으로 설정해야 합니다. Null 는 비교 중인 배열 요소가 이를 포함할 수 있는 경우 유효한 값일 수 있습니다. 예를 들어, 도쿄에 대한 인구 이름 및 값 쌍이 "population":null이고 비교 표현식이 "city.population == $population_min"인
경우, null이 $population_min 컨텍스트 변수에 올바른 값입니다.
다음과 같은 대화 노드 응답 표현식을 사용할 수 있습니다.
The cities with more than $population_min people include <? T(String).join(", ",($cities.filter("city", "city.population > $population_min")).![name]) ?>.
결과 응답은 The cities with more than 5000000 people include Tokyo, Beijing.입니다.
필터 예제 3
이 예제에서, 엔티티 이름이 comparison_value으로 사용됩니다. 사용자 입력은, What is the population of Tokyo? 입니다. 임의의 임시 변수 이름은 y입니다. Tokyo 를 포함하여 구/군/시 이름을 인식하는 @city 라는 엔티티를 작성했습니다.
$cities.filter("y", "y.name == @city")
이 표현식은 다음과 같은 배열을 리턴합니다.
[
{
"name":"Tokyo",
"population":9273000
}
]
콜렉션 투영법을 사용하여 원래 배열의 인구 요소만 포함하는 배열을 가져오고 get 메소드를 사용하여 인구 요소의 값을 리턴할 수 있습니다.
The population of @city is: <? ($cities.filter("y", "y.name == @city").![population]).get(0) ?>.
표현식은 The population of Tokyo is 9273000.을 리턴합니다.
JSONArray.get(Integer)
이 메소드는 JSONArray에서 입력 인덱스를 리턴합니다.
이 대화 상자의 런타임 컨텍스트는 이전 노드 또는 외부 응용 프로그램에 의해 설정됩니다
{
"context": {
"name": "John",
"nested": {
"array": [ "one", "two" ]
}
}
}
대화 노드 또는 응답 조건:
$nested.array.get(0).getAsString().contains('one')
결과: 중첩 배열에 one 항목이 값으로 포함되어 있으므로 True입니다.
응답:
"output": {
"generic" : [
{
"values": [
{
"text" : "The first item in the array is <?$nested.array.get(0)?>"
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
JSONArray.getRandomItem()
이 메소드는 입력 JSONArray에서 랜덤 항목을 리턴합니다.
이 대화 상자 런타임 컨텍스트의 경우:
{
"context": {
"toppings_array": ["onion", "olives", "ham"]
}
}
대화 상자 노드 출력:
{
"output": {
"generic" : [
{
"values": [
{
"text": "<? $toppings_array.getRandomItem() ?> is a great choice!"
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
결과: "ham is a great choice!" 또는 "onion is a great choice!" 또는 "olives is a great choice!"
결과 출력 텍스트는 임의로 선택됩니다.
JSONArray.indexOf(value)
이 메소드는 값을 배열에서 찾을 수 없는 경우 매개변수 또는 -1로 지정하는 값과 일치하는 배열에 있는 요소의 인덱스 번호를 리턴합니다. 값은 String( "School" ), Integer( 8 ), 또는 Double( 9.1 )일 수 있습니다. 값은 정확히 일치해야 하며 대소문자를 구분합니다.
예를 들어, 다음 컨텍스트 변수는 배열을 포함합니다.
{
"context": {
"array1": ["Mary","Lamb","School"],
"array2": [8,9,10],
"array3": [8.1,9.1,10.1]
}
}
다음 표현식을 사용하여 값이 지정된 배열 인덱스를 판별할 수 있습니다.
<? $array1.indexOf("Mary") ?> returns `0`
<? $array2.indexOf(9) ?> returns `1`
<? $array3.indexOf(10.1) ?> returns `2`
예를 들어, 이 메소드는 인텐트 배열에서 요소의 인덱스를 가져오는 데 유용할 수 있습니다. 사용자 입력을 평가하여 특정 인텐트의 배열 인덱스 번호를 판별할 때마다 생성되는 인텐트 배열에 indexOf 메소드를 적용할 수 있습니다.
intents.indexOf("General_Greetings")
특정 인텐트의 신뢰도 점수를 알려면 intents[index].confidence 구문이 있는 표현식에 index 값으로 이전 표현식을 전달할 수 있습니다. 예를 들어, 다음과 같습니다.
intents[intents.indexOf("General_Greetings")].confidence
JSONArray.join(String delimiter)
이 메소드는 이 배열의 모든 값을 하나의 문자열로 결합합니다. 값은 문자열로 변환되고 입력 구분 기호로 구분됩니다.
이 대화 상자 런타임 컨텍스트의 경우:
{
"context": {
"toppings_array": ["onion", "olives", "ham"]
}
}
대화 상자 노드 출력:
{
"output": {
"generic" : [
{
"values": [
{
"text": "This is the array: <? $toppings_array.join(';') ?>"
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
결과:
This is the array: onion;olives;ham;
사용자가 여러 토핑을 언급하는 경우, 토핑 언급을 인식할 수 있는 엔티티인 ' @toppings '를 정의했다면, 응답에 다음 표현식을 사용하여 언급된 토핑을 나열할 수 있습니다
So, you'd like <? @toppings.values.join(',') ?>.
JSON 배열에 여러 값을 저장하는 변수를 정의하는 경우 배열에서 값의 서브세트를 리턴할 수 있습니다. join() 메소드를 사용하여 적절하게 형식화하십시오.
콜렉션 투영법(collection projection)
collection projection SpEL 표현식은 오브젝트를 포함하고 있는 배열에서 서브콜렉션을 추출합니다. 콜렉션 프로젝션의 구문은 array_that_contains_value_sets.![value_of_interest]입니다.
예를 들어, 다음 컨텍스트 변수는 항공편 정보를 저장하는 JSON 배열을 정의합니다. 각 비행에는 두 개의 데이터 점 (시간 및 비행 코드) 이 있습니다.
"flights_found": [
{
"time": "10:00",
"flight_code": "OK123"
},
{
"time": "12:30",
"flight_code": "LH421"
},
{
"time": "16:15",
"flight_code": "TS4156"
}
]
항공편 코드만 리턴하려면 다음 구문을 사용하여 콜렉션 투영법 표현식을 작성할 수 있습니다.
<? $flights_found.![flight_code] ?>
이 표현식은 flight_code 값의 배열을 ["OK123","LH421","TS4156"]으로 리턴합니다. 자세한 내용은 스프링 표현식 언어(SpEL)문서를 참조하세요.
리턴되는 배열의 값에 join() 메소드를 적용하는 경우, 항공편 코드는 쉼표로 구분된 목록으로 표시됩니다. 예를 들어, 응답에서 다음 구문을 사용할 수 있습니다.
The flights that fit your criteria are:
<? T(String).join(",", $flights_found.![flight_code]) ?>.
결과: The flights that match your criteria are: OK123,LH421,TS4156.
JSONArray.joinToArray(template, retainDataType)
이 메소드는 배열의 각 항목에서 정보를 추출하고 사용자가 지정하는 템플리트에 따라 형식화된 새 배열을 빌드합니다. 템플리트는 문자열, JSON 오브젝트 또는 배열일 수 있습니다. 이 메소드는 템플리트의 유형에 따라 문자열의 배열, 오브젝트의 배열 또는 배열의 배열을 리턴합니다.
이 메소드는 대화 상자 노드의 출력의 일부로 리턴할 수 있는 문자열로 정보를 형식화하거나 외부 API와 함께 사용할 수 있도록 데이터를 다른 구조로 변환하는 데 유용합니다.
템플리트에서 다음 구문을 사용하여 소스 배열의 값을 참조할 수 있습니다. 여기서 {property} 은 소스 배열의 특성 이름을 나타냅니다.
%e.{property}%
예를 들어, 어시스턴트가 컨텍스트 변수에 항공편 세부사항을 포함하는 배열을 저장한다고 가정합니다. 저장된 데이터는 다음과 같습니다.
"flights": [
{
"flight": "AZ1040",
"origin": "JFK",
"carrier": "Alitalia",
"duration": 485,
"destination": "FCO",
"arrival_date": "2019-02-03",
"arrival_time": "07:00",
"departure_date": "2019-02-02",
"departure_time": "16:45"
},
{
"flight": "DL1710",
"origin": "JFK",
"carrier": "Delta",
"duration": 379,
"destination": "LAX",
"arrival_date": "2019-02-02",
"arrival_time": "10:19",
"departure_date": "2019-02-02",
"departure_time": "07:00"
},
{
"flight": "VS4379",
"origin": "BOS",
"carrier": "Virgin Atlantic",
"duration": 385,
"destination": "LHR",
"arrival_date": "2019-02-03",
"arrival_time": "09:05",
"departure_date": "2019-02-02",
"departure_time": "21:40"
}
]
이러한 플라이트를 사용자가 읽을 수 있는 양식으로 설명하는 문자열 배열을 빌드하려면 다음 표현식을 사용할 수 있습니다.
${Flight_data}.joinToArray("Flight %e.flight% to %e.destination%", true)
이 표현식은 다음 문자열 배열을 리턴합니다. ["Flight AZ1040 to FCO","Flight DL1710 to LAX","Flight VS4379 to LHR"].
선택적 retainDataType 매개변수는 메소드가 리턴된 배열에서 모든 입력 값의 데이터 유형을 보존해야 하는지 여부를 지정합니다. retainDataType 가 false 로 설정되거나 생략된 경우, 일부 상황에서는 입력 배열의 문자열이 리턴된 배열의 숫자로 변환될 수 있습니다. 예를 들어, 입력 배열에서 선택된 값이 "1",
"2" 및 "3" 인 경우 리턴되는 배열은 [ 1, 2, 3 ] 일 수 있습니다. 예기치 않은 유형 변환을 방지하려면 이 매개변수에 true 를 지정하십시오.
복합 템플리트
보다 복잡한 템플리트에는 읽기 쉬운 레이아웃으로 정보를 표시하는 형식화가 포함될 수 있습니다. 복합 템플리트의 경우 컨텍스트 변수에 템플리트를 저장할 수 있습니다. 그러면 문자열 대신 joinToArray 메소드로 전달할 수 있습니다.
예를 들어, 이 복합 템플리트에는 레이블 및 형식을 추가하는 배열 요소의 서브세트가 포함되어 있습니다.
<br/>Flight number: %e.flight% <br/> Airline: %e.carrier% <br/> Departure date: %e.departure_date% <br/> Departure time: %e.departure_time% <br/> Arrival time: %e.arrival_time% <br/>
템플리트에서 사용하는 형식이 어시스턴트 출력을 표시하는 채널 통합에서 지원되는지 확인하십시오.
Template 라는 컨텍스트 변수를 작성하고 이 템플리트를 해당 값으로 지정하는 경우 표현식에서 해당 변수를 사용할 수 있습니다.
${Flight_data}.joinToArray(${Template})
실행 시 응답은 다음과 같이 표시됩니다
Flight number: AZ1040
Airline: Alitalia
Departure date: 2019-02-02
Departure time: 16:45
Arrival time: 07:00
Flight number: DL1710
Airline: Delta
Departure date: 2019-02-02
Departure time: 07:00
Arrival time: 10:19
Flight number: VS4379
Airline: Virgin Atlantic
Departure date: 2019-02-02
Departure time: 21:40
Arrival time: 09:05
JSON 오브젝트 템플리트
문자열 대신 템플리트를 JSON 오브젝트로 정의할 수 있습니다. 이는 다른 시스템의 정보 형식을 표준화하거나 데이터를 외부 서비스에 필요한 형식으로 변환하는 방법을 제공합니다.
이 예에서 템플리트는 Flight data 컨텍스트 변수에 저장된 배열에 지정된 요소에서 항공편 세부사항을 추출하는 JSON 오브젝트로 정의됩니다.
{
"departure": "Flight %e.flight% departs on %e.departure_date% at %e.departure_time%.",
"arrival": "Flight %e.flight% arrives on %e.arrival_date% at %e.arrival_time%."
}
이 템플리트를 사용하여 joinToArray() 메소드는 지정된 구조의 새 오브젝트 배열을 리턴합니다.
JSONArray.remove(Integer)
이 메소드는 JSONArray에서 인덱스 위치의 요소를 제거하고 업데이트된 JSONArray를 리턴합니다.
이 대화 상자 런타임 컨텍스트의 경우:
{
"context": {
"toppings_array": ["onion", "olives"]
}
}
이 업데이트를 작성하십시오.
{
"context": {
"toppings_array": "<? $toppings_array.remove(0) ?>"
}
}
결과:
{
"context": {
"toppings_array": ["olives"]
}
}
JSONArray.removeValue(object)
이 메소드는 JSONArray에서 값의 첫 번째 발생을 제거하고 업데이트된 JSONArray를 리턴합니다.
이 대화 상자 런타임 컨텍스트의 경우:
{
"context": {
"toppings_array": ["onion", "olives"]
}
}
이 업데이트를 작성하십시오.
{
"context": {
"toppings_array": "<? $toppings_array.removeValue('onion') ?>"
}
}
결과:
{
"context": {
"toppings_array": ["olives"]
}
}
JSONArray.set(Integer index, Object value)
이 메소드는 JSONArray의 입력 인덱스를 입력 값으로 설정하고 수정된 JSONArray를 리턴합니다.
이 대화 상자 런타임 컨텍스트의 경우:
{
"context": {
"toppings_array": ["onion", "olives", "ham"]
}
}
대화 상자 노드 출력:
{
"context": {
"toppings_array": "<? $toppings_array.set(1,'ketchup')?>"
}
}
결과:
{
"context": {
"toppings_array": ["onion", "ketchup", "ham"]
}
}
JSONArray.size()
이 메소드는 JSONArray의 크기를 정수로 리턴합니다.
이 대화 상자 런타임 컨텍스트의 경우:
{
"context": {
"toppings_array": ["onion", "olives"]
}
}
이 업데이트를 작성하십시오.
{
"context": {
"toppings_array_size": "<? $toppings_array.size() ?>"
}
}
결과:
{
"context": {
"toppings_array_size": 2
}
}
JSONArray split(String regexp)
이 메소드는 입력 정규식을 사용하여 입력 문자열을 분할합니다. 결과는 문자열의 JSONArray입니다.
다음 입력의 경우:
"bananas;apples;pears"
이 구문:
{
"context": {
"array": "<?input.text.split(";")?>
}
}
이 출력의 결과:
{
"context": {
"array": [ "bananas", "apples", "pears" ]
}
}
com.google.gson.JsonArray support
내장 메소드 외에도, com.google.gson.JsonArray 클래스의 표준 메소드를 사용할 수 있습니다.
새 배열
new JsonArray().append('value')
사용자가 제공한 값으로 완성되는 새로운 배열을 정의하려면 배열을 인스턴스화하면 됩니다. 또한 이를 인스턴스화할 때 배열에 플레이스홀더 값을 추가해야 합니다. 다음 구문을 사용하여 수행할 수 있습니다.
{
"context":{
"answer": "<? output.answer?:new JsonArray().append('temp_value') ?>"
}
날짜 및 시간
날짜 및 시간에 대한 작업에 몇 가지 메소드를 사용할 수 있습니다.
사용자 입력에서 날짜 및 시간 정보를 인식하고 추출하는 방법에 대한 정보는 @sys-date 및 @sys-time 엔티티를 참조하십시오.
다음 문자열 형식은 메소드가 호출될 수 있는 날짜-시간 리터럴에 대해 지원됩니다.
- 시간의 경우에만:
HH:mm:ss또는HH:mm - 날짜만 해당:
yyyy-MM-dd - 날짜 및 시간의 경우:
yyyy-MM-dd HH:mm:ss - 시간대가 있는 날짜 및 시간의 경우:
yyyy-MM-dd HH:mm:ss VV. V 기호는 DateTimeFormatter 가져온 것으로, 유럽/런던과 같은 IANA 표준 시간대 데이터베이스(TZDB) 형식의 표준 시간대를 나타냅니다(예: 유럽/런던).
.after(String date or time)
날짜/시간 값이 날짜/시간 인수 다음에 있는지 여부를 판별합니다.
.before(String date or time)
날짜/시간 값이 날짜/시간 인수 앞에 있는지 여부를 판별합니다.
예를 들어, 다음과 같습니다.
-
@sys-time.before('12:00:00')
-
@sys-date.before('2016-11-21')
-
time vs. date,date vs. time,time vs. date and time와 같은 다른 항목을 비교하는 경우, 이 메서드는 false를 반환하고 응답 JSON 로그output.log_messages에 예외가 인쇄됩니다.예를 들어,
@sys-date.before(@sys-time)입니다. -
date and time vs. time를 비교해 보면, 이 방법은 날짜를 무시하고 시간만 비교합니다.
now(문자열 시간대)
yyyy-MM-dd HH:mm:ss 형식의 현재 날짜 및 시간이 포함된 문자열을 리턴합니다. 선택적으로 timezone 값을 지정하여 특정 시간대의 현재 날짜 및 시간을 가져오십시오. 리턴된 문자열은 yyyy-MM-dd HH:mm:ss 'GMT'XXX 형식으로 되어 있습니다.
- 정적 함수입니다.
- 다른 날짜/시간 메소드는 이 함수를 통해 리턴되는 날짜-시간 값에서 호출될 수 있으며 해당 인수로 전달될 수 있습니다.
- 사용자 인터페이스는 자동으로 "
$timezone" 컨텍스트 변수를 생성하므로 "Try it out" 창에서 테스트할 때 정확한 시간이 반환됩니다. 표준 시간대를 패스하지 않으면 UI에 의해 자동으로 설정되는 시간대가 사용됩니다. UI 외부에서는GMT가 표준 시간대로 사용됩니다. 시간대를 지정하는 구문에 대해 알아보려면 시스템 엔티티가 지원하는 시간대를 참조하십시오.
어시스턴트가 아침 특정 인사말로 응답하기 전에 아침인지 여부를 먼저 확인하기 위해 now() 를 사용하는 예입니다.
{
"conditions": "now().before('12:00:00')",
"output": {
"generic": [
{
"values": [
{
"text": "Good morning!"
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
현재 시간(영국 시간)을 반환하기 위해 시간대와 함께 now()를 사용하는 예:
{
"output": {
"generic": [
{
"values": [
{
"text": "The current date and time is: <? now('Europe/London') ?>"
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
표현식에 전달된 시간대를 기준으로 동적으로 시간을 변경하기 위해 하드코딩된 시간대 값을 컨텍스트 변수로 대체할 수 있습니다. 예를 들면, <? now('$myzone') ?>. $myzone 컨텍스트 변수는 한 대화에서 'Australia/Sydney'로 설정되고 다른 대화에서는 'Mexico/BajaNorte'로 설정될
수 있습니다.
.reformatDateTime(String format)
사용자 출력에 원하는 형식으로 날짜와 시간 문자열을 포맷합니다.
지정된 형식에 따라 형식화된 문자열을 리턴합니다.
- 12/31/2016의 경우
MM/dd/yyyy - 10pm의 경우
h a
요일을 다음과 같이 리턴합니다.
EEEE-화요일- Tue의 경우
E - 요일 인덱스(1 = 월요일, ..., 7 = 일요일)의 경우
u
예를 들어, 이 컨텍스트 변수 정의는 17:30:00 값을 5:30 PM으로 저장하는 $time 변수를 작성합니다.
{
"context": {
"time": "<? @sys-time.reformatDateTime('h:mm a') ?>"
}
}
형식은 Java SimpleDateFormat 규칙을 따릅니다.
참고: 시간만 포맷하려고 하면 날짜가 1970-01-01 로 처리됩니다.
.sameMoment(String date/time)
- 날짜/시간 값이 날짜/시간 인수와 같은지 여부를 판별합니다.
.sameOrAfter(String date/time)
- 날짜/시간 값이 날짜/시간 인수 이후인지 여부를 판별합니다.
.after()와 유사합니다.
.sameOrBefore(String date/time)
- 날짜/시간 값이 날짜/시간 인수 이전인지 여부를 판별합니다.
today()
yyyy-MM-dd 형식의 현재 날짜가 포함된 문자열을 리턴합니다.
- 정적 함수입니다.
- 다른 날짜 메소드는 이 함수를 통해 리턴되는 날짜 값에서 호출될 수 있으며 해당 인수로 전달될 수 있습니다.
- 컨텍스트 변수
$timezone이 설정되어 있으면 이 함수가 고객 시간대의 날짜를 리턴합니다. 그렇지 않은 경우,GMT시간대가 사용됩니다.
출력 필드에 사용되는 today()가 있는 대화 노드의 예제:
{
"conditions": "#what_day_is_it",
"output": {
"generic": [
{
"values": [
{
"text": "Today's date is <? today() ?>."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
결과: Today's date is 2018-03-09.
날짜 및 시간 계산
다음 방법을 사용하여 날짜를 계산하십시오. 여기서 <date> 는 yyyy-MM-dd 또는 yyyy-MM-dd HH:mm:ss 형식으로 지정됩니다.
| 메소드 | 설명 |
|---|---|
<date>.minusDays(n) |
지정된 날짜에서 n일 전인 날의 날짜를 리턴합니다. |
<date>.minusMonths(n) |
지정된 날짜에서 n달 전인 날의 날짜를 리턴합니다. |
<date>.minusYears(n) |
지정된 날짜에서 n년 전인 날의 날짜를 리턴합니다. |
<date>.plusDays(n) |
지정된 날짜에서 n일 후인 날의 날짜를 리턴합니다. |
<date>.plusMonths(n) |
지정된 날짜에서 n달 후인 날의 날짜를 리턴합니다. |
<date>.plusYears(n) |
지정된 날짜에서 n년 후인 날의 날짜를 리턴합니다. |
내일 날짜를 사용하려면 다음 표현식을 지정하십시오.
{
"output": {
"generic": [
{
"values": [
{
"text": "Tomorrow's date is <? today().plusDays(1) ?>."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
오늘이 2018년 3월 9일인 경우, 결과: Tomorrow's date is 2018-03-10.
오늘부터 1주일 후의 날짜를 가져오려면 다음 표현식을 지정하십시오.
{
"output": {
"generic": [
{
"values": [
{
"text": "Next week's date is <? @sys-date.plusDays(7) ?>."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
@sys-date 엔티티에서 캡처한 날짜가 오늘 날짜 2018년 3월 9일인 경우, 결과: Next week's date is 2018-03-16.
지난 달의 날짜를 사용하려면 다음 표현식을 지정하십시오.
{
"output": {
"generic": [
{
"values": [
{
"text": "Last month the date was <? today().minusMonths(1) ?>."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
오늘이 2018년 3월 9일인 경우, 결과: Last month the date was 2018-02-9.
다음 방법을 사용하여 시간을 계산하십시오. 여기서 <time> 는 HH:mm:ss 형식으로 지정됩니다.
| 메소드 | 설명 |
|---|---|
<time>.minusHours(n) |
지정된 시간에서 n시간 전인 시간을 리턴합니다. |
<time>.minusMinutes(n) |
지정된 시간에서 n분 전인 시간을 리턴합니다. |
<time>.minusSeconds(n) |
지정된 시간에서 n초 전인 시간을 리턴합니다. |
<time>.plusHours(n) |
지정된 시간에서 n시간 후인 시간을 리턴합니다. |
<time>.plusMinutes(n) |
지정된 시간에서 n분 후인 시간을 리턴합니다. |
<time>.plusSeconds(n) |
지정된 시간으로부터 n초 후의 시간을 반환합니다. |
지금부터 한 시간 후의 시간을 알려면 다음 표현식을 지정하십시오.
{
"output": {
"generic": [
{
"values": [
{
"text": "One hour from now is <? now().plusHours(1) ?>."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
오전 8시인 경우, 결과: One hour from now is 09:00:00.
30분 전 시간을 알려면 다음 표현식을 지정하십시오.
{
"output": {
"generic": [
{
"values": [
{
"text": "A half hour before @sys-time is <? @sys-time.minusMinutes(30) ?>."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
@sys-time 엔티티에서 캡처한 시간이 오전 8시인 경우, 결과: A half hour before 08:00:00 is 07:30:00.
리턴되는 시간을 다시 형식화하기 위해 다음 표현식을 사용할 수 있습니다.
{
"output": {
"generic": [
{
"values": [
{
"text": "6 hours ago was <? now().minusHours(6).reformatDateTime('h:mm a') ?>."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
오후 2시 19분인 경우, 결과: 6 hours ago was 8:19 AM.
시간 범위에 대한 작업
오늘 날짜가 특정 시간 프레임 내에 있는지 여부에 따라 응답을 표시하기 위해 시간 관련 메소드를 조합하여 사용할 수 있습니다. 예를 들어, 매년 명절 기간에 특별 오퍼를 실행하는 경우 오늘 날짜가 올해 11월 25일에서 12월 24일 사이인지 여부를 확인할 수 있습니다. 먼저 중요한 날짜를 컨텍스트 변수로 정의하십시오.
다음 시작일과 종료일 컨텍스트 변수 표현식에서, 날짜는 파생된 현재 연도 값과 하드코딩된 월과 일 값을 연결하여 구성됩니다.
"context": {
"end_date": "<? now().reformatDateTime('Y') + '-12-24' ?>",
"start_date": "<? now().reformatDateTime('Y') + '-11-25' ?>"
}
응답 조건에서, 현재 날짜가 컨텍스트 변수로 정의된 시작 및 종료 날짜 사이에 있는 경우에만 응답을 표시하도록 나타낼 수 있습니다.
now().after($start_date) && now().before($end_date)
java.util.Date support
내장 메소드 외에도, java.util.Date 클래스의 표준 메소드를 사용할 수 있습니다.
오늘부터 일주일 후의 날짜를 가져오려면 다음 구문을 사용할 수 있습니다.
{
"context": {
"week_from_today": "<? new Date(new Date().getTime() +
(7 * (24*60*60*1000L))) ?>"
}
}
이 표현식은 먼저 1970년 1월 1일 00:00:00 협정 세계시(UTC) 이후의 현재 날짜를 밀리초 단위로 가져옵니다. 또한 7 일간의 밀리 초를 계산합니다. ((24*60*60*1000L)은 하루를 밀리 초 단위로 나타냅니다.) 그런 다음 현재 날짜에 7일을 추가합니다. 결과는 오늘부터 일주일 후에 해당하는 날의 전체 날짜입니다. 예를 들어, Fri Jan 26 16:30:37 UTC 2018입니다.
시간은 협정 세계시 (UTC) 시간대입니다. 7을 전달할 수 있는 변수(예:$number_of_days)로 변경할 수 있습니다. 이 표현식이 평가되기 전에 값이 설정되었는지 확인하십시오.
서비스에서 생성된 다른 날짜와 날짜를 비교하려면 날짜 형식을 다시 지정해야 합니다. 시스템 엔티티(@sys-date) 및 기타 내장 메소드(now())는 날짜를 yyyy-MM-dd 형식으로 변환합니다.
{
"context": {
"week_from_today": "<? new Date(new Date().getTime() +
(7 * (24*60*60*1000L))).format('yyyy-MM-dd') ?>"
}
}
날짜 형식을 다시 지정하면 결과는 다음과 같습니다. 2018-01-26. 이제 응답 조건에서 ' @sys-date.after($week_from_today) '와 같은 표현식을 사용하여 사용자 입력에 지정된 날짜를 컨텍스트 변수에 저장된 날짜와 비교할 수 있습니다.
다음 표현식은 지금부터 3시간 후를 계산합니다.
{
"context": {
"future_time": "<? new Date(new Date().getTime() + (3 * (60*60*1000L)) -
(5 * (60*60*1000L))).format('h:mm a') ?>"
}
}
(60*60*1000L) 값은 밀리 초 단위로 시간을 나타냅니다. 이 표현식은 현재 시간에 3시간을 추가합니다. 그런 다음, 그로부터 5시간을 빼서 협정 세계시(UTC)에서 동부 표준시(EST)로 시간을 다시 계산합니다. 또한, 날짜 값이 AM 또는 PM에 시간과 분을 포함하도록 재형식화합니다.
숫자
이러한 메소드를 사용하여 숫자 값을 가져오고 재형식화할 수 있습니다.
사용자 입력에서 숫자를 인식하고 추출할 수 있는 시스템 엔티티에 대한 정보는 @sys-number 엔티티를 참조하십시오.
서비스가 사용자 입력에서 특정 숫자 형식을 인식하도록 하려면, 이를 캡처하기 위한 패턴 엔티티 작성을 고려하십시오. 세부사항은 엔티티 작성을 참조하십시오.
예를 들어, 숫자를 통화 값으로 재형식화하기 위해 숫자에 대한 10진수 배치를 변경하려는 경우, String format() 메소드를 참조하십시오.
toDouble()
오브젝트 또는 필드를 실수 유형으로 변환합니다. 오브젝트 또는 필드에서 이 메소드를 호출할 수 있습니다. 변환에 실패하면 널이 리턴됩니다.
toInt()
오브젝트 또는 필드를 정수 유형으로 변환합니다. 오브젝트 또는 필드에서 이 메소드를 호출할 수 있습니다. 변환에 실패하면 널이 리턴됩니다.
toLong()
오브젝트 또는 필드를 숫자(Long) 유형으로 변환합니다. 오브젝트 또는 필드에서 이 메소드를 호출할 수 있습니다. 변환에 실패하면 널이 리턴됩니다.
SpEL 표현식에서 Long 숫자 유형을 지정하는 경우 숫자에 L을 추가해야합니다. 예를 들어, 5000000000L입니다. 이 구문은 32비트 정수 유형에 맞지 않는 모든 숫자에 대해 필요합니다. 예를 들어, 2^31(2,147,483,648)보다 크거나 -2 (-2 보다 작은 숫자는 긴 숫자 유형으로 간주됩니다. Long 숫자 형식의 최소 값은 -2 ^ 63이고 최대 값은 2
^ 63-1(또는 9,223,372,036,854,775,807)입니다.
숫자가 너무 길어서 인식할 수 없는지 확인해야 하는 경우, 다음과 같은 표현식을 사용하여 숫자에 18개 이상의 정수가 있는지 확인하십시오
<? @sys-number.toString().length() > 18 ?>
18보다 큰 정수 값을 다루어야 한다면, @sys-number 대신 패턴 엔티티( \d{20} 와 같은 정규 표현식)를 사용하는 것이 좋습니다.
표준 수학
SpEL 표현식을 사용하여 표준 수학 방정식을 정의합니다. 여기서 연산자는 다음 기호를 사용하여 표시됩니다.
| 산술 연산 | 기호 |
|---|---|
| 더하기 |
|
| 나누기 | / |
| 곱하기 |
|
| 뺄셈 |
|
예를 들어, 대화 노드 응답에서 사용자 입력( @sys-number )에 지정된 숫자를 캡처하는 컨텍스트 변수를 추가하고 이를 $your_number 로 저장할 수 있습니다. 그런 다음 다음 텍스트를 텍스트 응답으로 추가할 수 있습니다.
I'm doing math. Given the value you specified ($your_number), when I add 5, I get: <? $your_number + 5 ?>.
When I subtract 5, I get: <? $your_number - 5 ?>.
When I multiply it by 5, I get: <? $your_number * 5 ?>.
When I divide it by 5, I get: <? $your_number/5 ?>.
사용자가 10을 지정하면 결과 텍스트 응답은 다음과 같습니다.
I'm doing math. Given the value you specified (10), when I add 5, I get: 15.
When I subtract 5, I get: 5.
When I multiply it by 5, I get: 50.
When I divide it by 5, I get: 2.
Java 숫자 지원
java.lang.Math()
기본 숫자 연산을 수행합니다.
클래스 메소드를 사용할 수 있습니다.
MAX()
{
"context": {
"bigger_number": "<? T(Math).max($number1,$number2) ?>"
},
"output": {
"generic": [
{
"values": [
{
"text": "The bigger number is $bigger_number."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
min()
{
"context": {
"smaller_number": "<? T(Math).min($number1,$number2) ?>"
},
"output": {
"generic": [
{
"values": [
{
"text": "The smaller number is $smaller_number."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
pow()
{
"context": {
"power_of_two": "<? T(Math).pow($base.toDouble(),2.toDouble()) ?>"
},
"output": {
"generic": [
{
"values": [
{
"text": "Your number $base to the second power is $power_of_two."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
자세한 정보는 java.lang.Math 참조 문서를 참조하십시오.
java.util.Random()
난수를 리턴합니다. 다음 구문 옵션 중 하나를 사용할 수 있습니다.
- 무작위 부울 값(true 또는 false)을 리턴하려면
<?new Random().nextBoolean()?>항목을 사용하십시오. - 0(포함)과 1(제외) 사이의 임의의 이중 숫자를 반환하려면
<?new Random().nextDouble()?>를 사용하십시오. - 0(포함됨) 및 지정하는 숫자 사이에 무작위 정수를 리턴하려면
<?new Random().nextInt(n)?>항목을 사용하십시오. 여기서 n은 +1을 원하는 숫자 범위의 맨 위입니다. 예를 들어, 0 및 10 사이의 난수를 리턴하려면<?new Random().nextInt(11)?>항목을 지정하십시오. - 전체 정수 값 범위(-2147483648 - 2147483648)에서 임의 정수를 리턴하려면
<?new Random().nextInt()?>항목을 사용하십시오.
예를 들어, #random_number 인텐트로 트리거되는 대화 노드를 작성할 수 있습니다. 첫 번째 응답 조건은 다음과 같습니다.
Condition = @sys-number
{
"context": {
"answer": "<? new Random().nextInt(@sys-number.numeric_value + 1) ?>"
},
"output": {
"generic": [
{
"values": [
{
"text": "Here's a random number between 0 and @sys-number.literal: $answer."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
]
}
}
다른 방법에 대한 정보는 java.util.Random 참조 문서를 참조하십시오.
다음 클래스의 표준 메소드도 사용할 수 있습니다.
java.lang.Bytejava.lang.Integerjava.lang.Longjava.lang.Doublejava.lang.Shortjava.lang.Float
오브젝트
JSONObject.clear()
이 메소드는 JSON 오브젝트에서 모든 값을 지우고 널을 리턴합니다.
예를 들어, $user 컨텍스트 변수에서 현재 값을 지우려고 합니다.
{
"context": {
"user": {
"first_name":"John",
"last_name":"Snow"
}
}
}
출력에서 다음 표현식을 사용하여 해당 값의 오브젝트를 지우는 필드를 정의하십시오.
{
"output": {
"object_eraser": "<? $user.clear() ?>"
}
}
{} $user 컨텍스트 변수를 참조하면, $user 컨텍스트 변수에 대한 참조가 있는 경우에만 $user_name을 반환합니다.
API clear() 호출의 본문에 있는 context 또는 output JSON 오브젝트에서 /message 메소드를 사용할 수 있습니다.
컨텍스트 지우기
clear() 메소드를 사용하여 context 오브젝트를 지우는 경우, 다음을 제외한 모든 변수를 지웁니다.
context.conversation_idcontext.timezonecontext.system
경고: 모든 컨텍스트 변수 값은 다음을 의미합니다.
- 현재 세션 동안 트리거된 노드에 있는 변수에 설정된 모든 기본값입니다.
- 현재 세션 동안 사용자나 외부 서비스가 제공한 정보로 기본값이 업데이트된 경우.
이 메소드를 사용하려면 출력 오브젝트에서 정의하는 변수의 표현식에서 이를 지정할 수 있습니다. 예를 들어, 다음과 같습니다.
{
"output": {
"generic": [
{
"values": [
{
"text": "Response for this node."
}
],
"response_type": "text",
"selection_policy": "sequential"
}
],
"context_eraser": "<? context.clear() ?>"
}
}
출력 지우기
clear() 메소드를 사용하여 output 오브젝트를 지우는 경우, 현재 노드에서 정의하는 텍스트 응답과 출력 오브젝트를 지우는 데 사용하는 변수를 제외한 모든 변수를 지웁니다. 아래 변수도 지우지 않습니다.
output.nodes_visitedoutput.nodes_visited_details
이 메소드를 사용하려면 출력 오브젝트에서 정의하는 변수의 표현식에서 이를 지정할 수 있습니다. 예를 들어, 다음과 같습니다.
{
"output": {
"generic": [
{
"values": [
{
"text": "Have a great day!"
}
],
"response_type": "text",
"selection_policy": "sequential"
}
],
"output_eraser": "<? output.clear() ?>"
}
}
트리의 이전 노드가 I'm happy to help.의 텍스트 응답을 정의한 후 이전에 정의된 JSON 출력 오브젝트를 사용하여 노드로 점프하는 경우 Have a great day.만 응답으로 표시됩니다. I'm happy to help. 의 출력은 지워지고 clear() 메서드를 호출하는 노드의 텍스트 응답으로 대체되기 때문에
표시되지 않습니다.
JSONObject.has(String)
이 메소드는 복합 JSONObject에 입력 이름의 특성이 있는 경우 true를 리턴합니다.
이 대화 상자 런타임 컨텍스트의 경우:
{
"context": {
"user": {
"first_name": "John",
"last_name": "Snow"
}
}
}
대화 상자 노드 출력:
{
"conditions": "$user.has('first_name')"
}
결과: 사용자 오브젝트에 first_name 특성이 있으므로 조건은 true입니다.
JSONObject.remove(String)
이 메소드는 입력 JSONObject에서 이름의 특성을 제거합니다. 이 메소드에서 리턴되는 JSONElement는 제거되는 JSONElement입니다.
이 대화 상자 런타임 컨텍스트의 경우:
{
"context": {
"user": {
"first_name": "John",
"last_name": "Snow"
}
}
}
대화 상자 노드 출력:
{
"context": {
"attribute_removed": "<? $user.remove('first_name') ?>"
}
}
결과:
{
"context": {
"user": {
"last_name": "Snow"
},
"attribute_removed": {
"first_name": "John"
}
}
}
com.google.gson.JsonObject 지원
내장 메소드 외에, com.google.gson.JsonObject 클래스의 표준 메소드 중 일부도 지원됩니다.
문자열
이 메소드는 텍스트로 작업하는 데 도움이 됩니다.
사용자 입력에서 특정 유형의 문자열(사용자 이름 및 위치)을 인식하고 추출하는 방법에 대한 정보는 시스템 엔티티를 참조하십시오.
참고: 정규 표현식을 포함하는 메서드의 경우 정규 표현식을 지정할 때 사용할 구문에 대한 자세한 내용은 RE2 구문 참조를 확인하세요.
String.append(Object)
이 메소드는 입력 오브젝트를 문자열에 문자열로 추가하고 수정된 문자열을 리턴합니다.
이 대화 상자 런타임 컨텍스트의 경우:
{
"context": {
"my_text": "This is a text."
}
}
이 구문:
{
"context": {
"my_text": "<? $my_text.append(' More text.') ?>"
}
}
이 출력의 결과:
{
"context": {
"my_text": "This is a text. More text."
}
}
String.contains(String)
이 메소드는 문자열에 입력 하위 문자열이 포함되어 있는 경우 true를 리턴합니다.
입력: Yes, I'd like to go.
이 구문:
{
"conditions": "input.text.contains('Yes')"
}
결과: 조건이 true입니다.
String.endsWith(String)
이 메소드는 문자열이 입력 하위 문자열로 끝나는 경우 true를 리턴합니다.
다음 입력의 경우:
"What is your name?".
이 구문:
{
"conditions": "input.text.endsWith('?')"
}
결과: 조건이 true입니다.
String.equals(문자열)
이 메소드는 지정된 문자열이 입력 문자열과 정확히 동일한 경우 true 항목을 리턴합니다.
입력: "예"
이 구문:
{
"conditions": "input.text.equals('Yes')"
}
결과: 조건이 true입니다.
입력이 Yes.인 경우 사용자가 마침표를 포함하고 표현식에 구두점이 없는 정확한 텍스트 Yes만 예상하기 때문에 결과는 false입니다.
String.equalsIgnoreCase(String)
이 방법은 지정된 문자열이 입력 문자열과 같으면 대소문자의 일치 여부와 관계없이 " true "를 반환합니다.
입력: "예"
이 구문:
{
"conditions": "input.text.equalsIgnoreCase('Yes')"
}
결과: 조건이 true입니다.
입력이 Yes. 이면 결과는 false 입니다. 사용자가 마침표를 포함시켰기 때문에, 표현식은 구두점 없이 대문자 또는 소문자로 된 텍스트 Yes 만을 기대하기 때문입니다.
String.extract(String regexp, Integer groupIndex)
이 메소드는 입력에서 지정한 정규식 그룹 패턴과 일치하는 문자열을 리턴합니다. 일치하는 항목이 없으면 빈 문자열을 리턴합니다.
이 메소드는 단일 regex 패턴에 대해 서로 다른 일치가 아니라 서로 다른 regex 패턴 그룹에 대한 일치를 추출하도록 설계되었습니다. 다른 일치를 찾으려면 getMatch 메소드를 참조하십시오.
이 예제에서 컨텍스트 변수는 사용자가 지정하는 정규식 패턴 그룹과 일치하는 문자열을 저장합니다. 표현식에서 두 개의 regex 패턴 그룹이 정의되어 있으며 각 그룹은 소괄호로 묶입니다. 고유한 세 번째 그룹은 두 그룹으로 구성됩니다. 이것은 첫 번째 groupIndex ) 정규식 그룹입니다. 전체 숫자 그룹과 텍스트 그룹을 포함하는 문자열과 일치합니다. 두 번째 regex 그룹(groupIndex 1)은 숫자 그룹의 첫 번째 발생과 일치합니다. 세 번째 그룹(groupIndex 2)은 숫자 그룹 다음에 있는 텍스트 그룹의 첫 번째 항목과 일치합니다.
{
"context": {
"number_extract": "<? input.text.extract('([\\d]+)(\\b [A-Za-z]+)',n) ?>"
}
}
정규식을 JSON 으로 지정하는 경우 두 개의 백슬래시(\)를 제공해야 합니다. 노드 응답에 이 표현식을 지정하는 경우 하나의 백슬래시만 필요합니다. 예를 들어, 다음과 같습니다.
<? input.text.extract('([\d]+)(\b [A-Za-z]+)',n) ?>
입력:
"Hello 123 this is 456".
결과:
- n=
0이면 값은123 this입니다. - n=
1이면 값은123입니다. - n=
2이면 값은this입니다.
String.find(String regexp)
이 메소드는 문자열의 세그먼트가 입력 정규식과 일치하는 경우 true를 리턴합니다. 이 방법을 JSONArray 또는 JSONObject 요소에 적용할 수 있으며, 비교하기 전에 배열 또는 객체를 문자열로 변환합니다.
다음 입력의 경우:
"Hello 123456".
이 구문:
{
"conditions": "input.text.find('^[^\d]*[\d]{6}[^\d]*$')"
}
결과: 입력 텍스트의 숫자 부분이 정규식 ^[^\d]*[\d]{6}[^\d]*$와 일치하므로 조건은 true입니다.
String.getMatch(String regexp, Integer matchIndex)
이 메소드는 입력에서 지정한 정규식 패턴의 발생과 일치하는 문자열을 리턴합니다. 일치하는 항목이 없으면 빈 문자열을 리턴합니다.
일치하는 항목이 발견되면 일치 배열로 여러분이 생각하는 것에 추가됩니다. 배열 요소 수가 0에서 시작되므로 세 번째 일치를 리턴하려면 2를 matchIndex 값으로 지정하십시오. 예를 들어, 지정된 패턴과 일치하는 세 개의 단어가 있는 텍스트 문자열을 입력하면 해당 인덱스 값을 지정하여 첫 번째, 두 번째 또는 세 번째 일치만 리턴할 수 있습니다.
다음 표현식에서는 입력에서 숫자 그룹을 찾습니다. 이 표현식은 인덱스 값 1이 지정되었기 때문에 두 번째 패턴 일치 문자열을 $second_number 컨텍스트 변수에로 저장합니다.
{
"context": {
"second_number": "<? input.text.getMatch('([\\d]+)',1) ?>"
}
}
JSON 구문에서 표현식을 지정하는 경우 두 개의 백슬래시(\)를 제공해야 합니다. 노드 응답에 표현식을 지정하는 경우 하나의 백슬래시만 필요합니다.
예를 들어, 다음과 같습니다.
<? input.text.getMatch('([\d]+)',1) ?>
-
사용자 입력:
"hello 123 i said 456 and 8910". -
결과:
456
이 예에서, 이 표현식은 입력에서 세 번째 텍스트 블록을 찾습니다.
<? input.text.getMatch('(\b [A-Za-z]+)',2) ?>
동일한 사용자 입력의 경우 이 표현식은 and를 리턴합니다.
String.isEmpty()
이 메소드는 문자열이 널이 아닌 빈 문자열인 경우 true를 리턴합니다.
이 대화 상자 런타임 컨텍스트의 경우:
{
"context": {
"my_text_variable": ""
}
}
이 구문:
{
"conditions": "$my_text_variable.isEmpty()"
}
결과: 조건이 true입니다.
String.length()
이 메소드는 문자열의 문자 길이를 리턴합니다.
다음 입력의 경우:
"Hello"
이 구문:
{
"context": {
"input_length": "<? input.text.length() ?>"
}
}
이 출력의 결과:
{
"context": {
"input_length": 5
}
}
String.matches(String regexp)
이 메소드는 문자열이 입력 정규식과 일치하는 경우 true를 리턴합니다.
다음 입력의 경우:
"Hello".
이 구문:
{
"conditions": "input.text.matches('^Hello$')"
}
결과: 입력 텍스트가 정규식 \^Hello\$와 일치하므로 조건은 true입니다.
String.startsWith(String)
이 메소드는 문자열이 입력 하위 문자열로 시작되는 경우 true를 리턴합니다.
다음 입력의 경우:
"What is your name?".
이 구문:
{
"conditions": "input.text.startsWith('What')"
}
결과: 조건이 true입니다.
String.substring(Integer beginIndex, Integer endIndex)
이 방법은 beginIndex 에 있는 문자와 endIndex 이전에 색인된 마지막 문자를 가진 부분 문자열을 가져옵니다. endIndex 문자는 포함되지 않습니다.
이 대화 상자 런타임 컨텍스트의 경우:
{
"context": {
"my_text": "This is a text."
}
}
이 구문:
{
"context": {
"my_text": "<? $my_text.substring(5, $my_text.length()) ?>"
}
}
이 출력의 결과:
{
"context": {
"my_text": "is a text."
}
}
String.toJson()
이 메소드는 JSON 데이터를 포함하는 문자열을 구문 분석하고 다음 예제와 같이 JSON 오브젝트 또는 배열을 리턴합니다.
${json_var}.toJson()
컨텍스트 변수 ${json_var} 에 다음 문자열이 포함된 경우:
"{ \"firstname\": \"John\", \"lastname\": \"Doe\" }"
toJson() 메소드는 다음 오브젝트를 리턴합니다.
{
"firstname": "John",
"lastname": "Doe"
}
String.toLowerCase()
이 방법은 소문자로 변환된 원본 문자열을 반환합니다.
다음 입력의 경우:
"This is A DOG!"
이 구문:
{
"context": {
"input_lower_case": "<? input.text.toLowerCase() ?>"
}
}
이 출력의 결과:
{
"context": {
"input_lower_case": "this is a dog!"
}
}
String.toUpperCase()
이 방법은 대문자로 변환된 원본 문자열을 반환합니다.
다음 입력의 경우:
"hi there".
이 구문:
{
"context": {
"input_upper_case": "<? input.text.toUpperCase() ?>"
}
}
이 출력의 결과:
{
"context": {
"input_upper_case": "HI THERE"
}
}
String.trim()
이 메소드는 문자열의 시작과 끝에 있는 공백을 자르고 수정된 문자열을 리턴합니다.
이 대화 상자 런타임 컨텍스트의 경우:
{
"context": {
"my_text": " something is here "
}
}
이 구문:
{
"context": {
"my_text": "<? $my_text.trim() ?>"
}
}
이 출력의 결과:
{
"context": {
"my_text": "something is here"
}
}
java.lang.String 지원
내장 메소드 외에도, java.lang.String 클래스의 표준 메소드를 사용할 수 있습니다.
java.lang.String.format()
표준 Java 문자열 format() 메소드를 텍스트에 적용할 수 있습니다. 포맷 세부 사항을 지정하는 데 사용할 구문에 대한 정보는 java.util.formatter 참조를 참조하십시오.
예를 들어, 다음 표현식은 3개의 10진 정수(1, 1 및 2)를 가져와서 이를 문장에 추가합니다.
{
"formatted String": "<? T(java.lang.String).format('%d + %d equals %d', 1, 1, 2) ?>"
}
결과: 1 + 1 equals 2.
숫자에 대한 10진수 배치를 변경하려면 다음 구문을 사용하십시오.
{
<? T(String).format('%.2f',<number to format>) ?>
}
예를 들어, 미국 달러로 포맷해야 하는 변수( $number )가 4.5 인 경우, Your total is $<? T(String).format('%.2f',$number) ?> 와 같은 응답은 Your total is $4.50. 를 반환합니다.
간접 데이터 유형 변환
예를 들어 노드 응답의 일부로 텍스트 내에 표현식을 포함하면 값은 문자열로 렌더링됩니다. 사용자가 원래의 데이터 유형에 렌더링되는 표현식을 원하는 경우, 이를 텍스트로 둘러싸지 마십시오.
예를 들어, 다음 표현식을 대화 노드 응답에 추가하여 사용자 입력에서 인식되는 엔티티를 문자열 형식으로 리턴할 수 있습니다.
The entities are <? entities ?>.
사용자가 입력으로 Hello now를 지정하면, @sys-date 및 @sys-time 엔티티를 now 참조에서 트리거합니다. 엔티티 오브젝트는 배열이지만 표현식이 텍스트에 포함되어 있으므로 엔티티는 다음과 같은 문자열 형식으로 리턴됩니다.
The entities are 2018-02-02, 14:34:56.
응답에서 텍스트를 포함하지 않으면, 배열이 대신 리턴됩니다. 예를 들어, 응답이 텍스트로 둘러싸여 있지 않고 표현식으로만 지정됩니다.
<? entities ?>
엔티티 정보는 원래 데이터 유형 그대로 배열로 반환됩니다.
[
{
"entity":"sys-date","location":[6,9],"value":"2018-02-02","confidence":1,"metadata":{"calendar_type":"GREGORIAN","timezone":"America/New_York"}
},
{
"entity":"sys-time","location":[6,9],"value":"14:33:22","confidence":1,"metadata":{"calendar_type":"GREGORIAN","timezone":"America/New_York"}
}
]
또 다른 예제로서, 다음 $array 컨텍스트 변수는 배열이지만 $string_array 컨텍스트 변수는 문자열입니다.
{
"context": {
"array": [
"one",
"two"
],
"array_in_string": "this is my array: $array"
}
}
이 컨텍스트 변수들의 값을 체험판 창에서 확인해 보면, 다음과 같이 지정된 값을 볼 수 있습니다:
$array : ["one","two"]
$array_in_string : "this is my array: [\"one\",\"two\"]"
<? $array.removeValue('two') ?> 와 같은 배열 메서드는 $array 변수에 대해 수행할 수 있지만, $array_in_string 변수에 대해서는 수행할 수 없습니다.