isAlpha или isAlphanumeric в dataweave не работают должным образом

У меня есть 2 ключа в полезной нагрузке, для которых я хочу проверить значения, вот сценарии

{
    "System" : "ABC",
    "Number" : 123.45
},
{
    "System" : "ABC123",
    "Number" : "123abc"
}

Я хочу проверить, содержит ли строка System только символы, а не числа.

Я пробовал isAlphanumeric(payload[0].system) или contains(payload[0].system, /^[0-9]+$/, но это все равно не дало мне правильного результата. как сделать так, чтобы в системе были только символы, а не буквы и цифры?

То же самое для числа, я хочу проверить, есть ли в числовом поле какой-либо символ или нет? Если я использую isNumeric(payload[0].number), он не проверяет десятичную дробь и возвращает false, если число имеет десятичные дроби, если я использую isDecimal(payload[0].number) и если число 1234, это не проверяет.

Как мне проверить эти 2 поля?


person anxiousAvocado    schedule 09.03.2021    source источник


Ответы (1)


Имейте в виду, что в вашем примере вы смешиваете типы String и Number для одного и того же поля; isDecimal требует Number и используется только для определения того, является ли Number десятичным числом или нет. Когда вы вызываете его, вам уже нужно знать, относится ли он к типу Number. Если вы хотите иметь возможность смешивать и сопоставлять типы:

Вход:

[{
    "System" : "ABC",
    "Number" : 123.45
},
{
    "System" : "ABC123",
    "Number" : "123abc"
},
{
    "System": "AAAA-AAA",
    "Number": "1234"
},
{
    "System": "KLDJSKL2123",
    "Number": 123
},
{
    "System": "KLDJSLKFJ",
    "Number": "123.45"
}]

Dataweave:

%dw 2.0
import isAlpha from dw::core::Strings

var isNumericOrDecimal = (str: Number | String) ->
    str match {
        case is Number -> true
        case str matches /^[\+\-]?\d*\.?\d+(?:[Ee][\+\-]?\d+)?/ -> true
        else -> false 
    }

output application/json
---
payload map { System: isAlpha($.System), Number: isNumericOrDecimal($.Number) }

Выход:

[
  {
    "System": true,
    "Number": true
  },
  {
    "System": false,
    "Number": false
  },
  {
    "System": false,
    "Number": true
  },
  {
    "System": false,
    "Number": true
  },
  {
    "System": true,
    "Number": true
  }
]
person Michael Jones    schedule 09.03.2021
comment
Спасибо, позвольте мне попробовать. почему-то dwlang.fun без причины решил уйти в офлайн. - person anxiousAvocado; 09.03.2021
comment
@ apple123 - вы можете самостоятельно организовать игровую площадку, уф. Существует как интерфейс командной строки, так и контейнер докеров, которые можно использовать для локального запуска вашего собственного экземпляра. - person Michael Jones; 09.03.2021
comment
@ apple123 Вы также можете попробовать этот dwl.mule.club - person Dale; 09.03.2021
comment
Ничего себе, никогда не знал о CLI для dw. Я определенно собираюсь попробовать это, а пока позвольте мне попробовать dwl.mule.club - person anxiousAvocado; 09.03.2021
comment
@ apple123 github.com/mulesoft-labs/data-weave-native вы можете установить его через homebrew, а затем запустить свою собственную игровую площадку dw --eval --spell Playground. Я предпочитаю контейнер докеров, потому что у меня он всегда работает - person Michael Jones; 09.03.2021
comment
@MichaelJones Спасибо, что уделили время этому, похоже, это работает, я сейчас тестирую. Я был бы очень признателен, если бы вы мне объяснили, что делает regEx? v Я хочу лучше понять для будущего использования. - person anxiousAvocado; 09.03.2021
comment
@ apple123 - Взгляните на regex101.com - он сломает регулярное выражение за вас. Я не писал это регулярное выражение, но оно предназначено для соответствия целому ряду вещей. например: -1.9E-10 действительно; его вспомогательная научная нотация. Возможно, вы этого не захотите; однако dataweave поддерживает его при преобразовании строк в числа! - person Michael Jones; 09.03.2021
comment
@ apple123 В основном он имеет необязательный + или - в начале, затем от 0 до бесконечности числовых символов, затем, необязательно, десятичный, а затем, по крайней мере, от 1 до бесконечности числовых символов, а затем как не захватывающая группа, которая может встречаться 0 или 1 раз целиком: e или E (минимум один!), за которым следует необязательный знак и от 1 до бесконечности цифр. - person Michael Jones; 09.03.2021
comment
Спасибо за все объяснения, у меня только что возник еще один вопрос, я должен опубликовать его отдельно или я могу спросить вас здесь, в чате? это похоже на эти поля - person anxiousAvocado; 09.03.2021
comment
@ apple123 - это во многом зависит от того, связано ли это с какой-либо настройкой решения или отдельным (даже если связанным) вопросом. Смысл stackoverflow в том, чтобы помочь людям найти ответы на свои вопросы, поэтому, если он может стоять как отдельный вопрос, я бы задал отдельный вопрос. - person Michael Jones; 09.03.2021
comment
Позвольте нам продолжить это обсуждение в чате. - person Michael Jones; 09.03.2021