【问题标题】:Trouble using #regex marker使用#regex 标记时遇到问题
【发布时间】:2019-06-10 22:25:38
【问题描述】:

我在构建正确的#regex 标记时遇到问题。

我正在尝试匹配响应 JSON 中的几种日期格式:

"created": "2017-03-23T14:16:25.854Z" "modified": "2018-06-21T05:38:37.978Z"

我尝试了以下标记:

'#regex [0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z' '#regex [0-9]{4}-[0-9]{2}-[0-9]{2}.[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}.' '#regex \d+-\d+-\d+.\d+:\d+:\d+.\d+.'

所有 3 种形式似乎都是正确的(根据 rubular.com)。我也玩过可能有问题的转义字符。到目前为止,我唯一能够完成的工作是:

[0-9-T:.Z]+

但这感觉有点“松散”的模式匹配。

基本上我正在尝试这个:

* def meta = { created: '#regex[[0-9]{4}-[0-9]{2}-[0-9]{2}.[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}.]', modified: '#regex[[0-9]{4}-[0-9]{2}-[0-9]{2}.[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}.]' } And match each response == """ { id: '#regex [a-z0-9]+', name: '#string', type: '<Type>', meta: #(meta), integration_id: '#uuid' } """

得到类似这样的错误:

KarateException: objects-api.feature:40 - path: $[0].meta.created, actual: '2016-11-30T20:48:16.782Z', expected: '#regex [0-9]+-[0-9]+-[0-9]+[0-9]+:[0-9]+:[0-9]+[0-9]+', reason: regex match failed

【问题讨论】:

    标签: karate


    【解决方案1】:

    这是一个建议,你为什么不将日期解析为 java Date 对象,这将开辟更多可能性,例如能够比较 2 个日期。

    以下是很好的例子: https://stackoverflow.com/a/54133126/143475 https://stackoverflow.com/a/55938480/143475

    也就是说,我认为您错过了必须转义反斜杠的情况,这是 Java 的事情,并且在文档中有所提及。所以这行得通:

    * def date = '2017-03-23T14:16:25.854Z'
    * match date == '#regex \\d+-\\d+-\\d+.\\d+:\\d+:\\d+.\\d+.'
    * match date == '#regex [0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z'
    

    Karate JS 引擎也支持RegExp JS 对象,所以看看这个例子是否也给你一些解决方案:

    https://stackoverflow.com/a/54768838/143475

    编辑,这也适用于我:

    * def meta = { created: '#regex \\d+-\\d+-\\d+.\\d+:\\d+:\\d+.\\d+.', modified: '#regex \\d+-\\d+-\\d+.\\d+:\\d+:\\d+.\\d+.' }
    * def response = [{ meta: { created: '2017-03-23T14:16:25.854Z', modified: '2018-06-21T05:38:37.978Z' } }]
    * match each response == { meta: '#(meta)' }
    

    【讨论】:

    • 谢谢彼得。您的简化示例按预期工作,但是当我尝试将正则表达式放在“内联”快捷方式中时,它无法匹配正则表达式:并匹配每个响应 == """ { id: '#regex [ a-z0-9]+',名称:'#string',类型:'',元:{ 创建:'#regex \\d+-\\d+-\\d+.\\d+:\\ d+:\\d+.\\d+.',修改:'#regex \\d+-\\d+-\\d+.\\d+:\\d+:\\d+.\\d+.' }, integration_id: '#uuid' } """
    • @kpschmidt 看到我的编辑。如果你仍然不能让它工作,请按照这个过程:github.com/intuit/karate/wiki/How-to-Submit-an-Issue
    • 另一条信息...我创建了一个动态场景大纲,它可以很好地迭代值。如果我回到静态定义的大纲,则正则表达式会按预期工作。它看起来更像是在使用动态场景大纲,让事情变得很糟糕。
    • 我相信我正在遵循这个过程。如果您觉得我进行根本原因分析对这个问题没有价值,那么是的,我可以将其标记为“已接受”,因为在“工作”的基本意义上,它确实如此,除了使用动态情景大纲。要我为此提出问题吗?
    • @kpschmidt 是的,是的。当我说过程时,它是我在上面发布的链接,将在这里再次重复以消除任何混淆:github.com/intuit/karate/wiki/How-to-Submit-an-Issue
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多