Specification
$imports: [ 'types/date', 'types/money' ]
$flags: 'FLEXIBLE_WHITESPACE'
Payment:
$fields:
money: Money
date: Date
$patterns: '#{money} due on #{date}'
Imported types
types/number.yml
Number:
Integer: '\d+'
Decimal: '${Integer}\.${Integer}+'
types/currency.yml
Currency:
EUR: 'EUR'
USD: 'USD'
GBP: 'GBP'
types/money.yml
$imports: [ 'number', 'currency' ]
$flags: 'FLEXIBLE_WHITESPACE'
Money:
$fields:
currency: Currency
amount: Number
$patterns: '#{currency} #{amount}'
types/date.yml
$imports: 'number'
Month:
JAN: 'January'
FEB: 'February'
MAR: 'March'
APR: 'April'
MAY: 'May'
JUN: 'June'
JUL: 'July'
AUG: 'August'
SEP: 'September'
OCT: 'October'
NOV: 'November'
DEC: 'December'
Date:
ISO:
$fields:
year: { $type: Integer, $patterns: '\d{4}' }
month: { $type: Integer, $patterns: '0[1-9]|1[0-2]' }
day: { $type: Integer, $patterns: '0[1-9]|[12]\d|3[01]' }
$patterns:
- '#{year}-#{month}-#{day}'
- '#{month}/#{day}/#{year}'
- '#{day}-#{month}-#{year}'
Textual:
$fields:
year: { $type: Integer, $patterns: '\d{4}' }
month: Month
day: { $type: Integer, $patterns: '0[1-9]|[12]\d|3[01]' }
$patterns:
- '#{month} #{day}, #{year}'
Sample input
EUR 50.5 due on May 31, 2025
USD 20 due on 2026-01-15
Result
[
{
"type": "Payment",
"text": "EUR 50.5 due on May 31, 2025",
"start": 0,
"end": 28,
"fields": [
{
"type": "Money",
"field": "money",
"text": "EUR 50.5",
"start": 0,
"end": 8,
"fields": [
{
"type": "Currency::EUR",
"field": "currency",
"text": "EUR",
"start": 0,
"end": 3
},
{
"type": "Number::Decimal",
"field": "amount",
"text": "50.5",
"start": 4,
"end": 8
}
]
},
{
"type": "Date::Textual",
"field": "date",
"text": "May 31, 2025",
"start": 16,
"end": 28,
"fields": [
{
"type": "Month::MAY",
"field": "month",
"text": "May",
"start": 16,
"end": 19
},
{
"type": "Number::Integer",
"field": "day",
"text": "31",
"start": 20,
"end": 22
},
{
"type": "Number::Integer",
"field": "year",
"text": "2025",
"start": 24,
"end": 28
}
]
}
]
},
{
"type": "Payment",
"text": "USD 20 due on 2026-01-15",
"start": 29,
"end": 53,
"fields": [
{
"type": "Money",
"field": "money",
"text": "USD 20",
"start": 29,
"end": 35,
"fields": [
{
"type": "Currency::USD",
"field": "currency",
"text": "USD",
"start": 29,
"end": 32
},
{
"type": "Number::Integer",
"field": "amount",
"text": "20",
"start": 33,
"end": 35
}
]
},
{
"type": "Date::ISO",
"field": "date",
"text": "2026-01-15",
"start": 43,
"end": 53,
"fields": [
{
"type": "Number::Integer",
"field": "year",
"text": "2026",
"start": 43,
"end": 47
},
{
"type": "Number::Integer",
"field": "month",
"text": "01",
"start": 48,
"end": 50
},
{
"type": "Number::Integer",
"field": "day",
"text": "15",
"start": 51,
"end": 53
}
]
}
]
}
]