mongodb / jsonpath / jmespath 表达式过滤属性包含特殊字符或重音字符的对象

mongodb / jsonpath / jmespath expression to filter object with properties that contain special or accented characters

我需要过滤这个json中包含特殊字符的对象。 (我可以写一个javascript或者导入查询mongo中的数据。)

{
    "Detail": [{
            "name": "somename1",
            "text": "Sometext1"
        },
        {
            "name": "somename2",
            "text": "Sometext!"
        }, {
            "name": "somename3",
            "text": "método"
        }
    ]
}

预期输出

{
    "Detail": [
        {
            "name": "somename2",
            "text": "Sometext!"
        },
        {
            "name": "somename3",
            "text": "método"
        }
    ]
}

有没有办法在 jsonpath 或 jmspath 中使用正则表达式来做到这一点?

我尝试了各种方法来接近我需要的东西,比如这些,但我现在受阻了

Detail[].text.contains(`é`) in jmespath

$.[?(@.text=~ ^[a-zA-Z0-9]*$].text in jsonpath

db.test.find({'Detail.text': /[a-zA-Z0-9]*$]/}) in mongodb where 'test' is the collection

我认为你应该试试这个工具 Jayway JsonPath https://github.com/json-path/JsonPath

我在这里在线试过https://jsonpath.herokuapp.com/

在这张图片中你可以看到输出。

这是我使用的正则表达式

.Detail[?(@.text =~ /(?:^\W+\w*$)|(?:^\w+\W+$)|(?:^\w+\W+\w+$)/)]

我把问题分成了三组

  1. 字符串以至少一个特殊字符或非单词字符 ^\W+ 开头,后跟零个或多个单词字符,即 $éxito

  2. 该字符串至少以一个单词字符 ^\w+ 开头,后面跟着零个或多个非单词字符 \w* 即 culminó, knowledge.

  3. 字符串以至少一个单词字符 ^\w+ 开头,然后是一个或多个非单词字符 \W+ 然后至少一个单词字符,即 beneplácito,now|knowledge,what $$$$发生了。

前面的每个案例都使用 non-capturing 组 (?:) 进行分组,并且使用的逻辑运算是 OR (|),因为您的字符串可以匹配三个组中的任何一个。

我也用过这个工具https://regexr.com/来准备正则表达式

顺便说一句,这是基于这个答案