Apache Camel/regex替换字符

Apache Camel/regex替换字符,regex,apache-camel,Regex,Apache Camel,我们有一个JSON字符串作为oData查询的结果返回 我们希望去掉标签上的“@”标志,如 @小田 梅斯丹_journaltype@OData.Community.Display.V1.FormattedValue 梅斯丹_endtime@OData.Community.Display.V1.FormattedValue 等 不触摸电子邮件地址值,如“email”:bob@thebuilder.com“ 我在上阅读了ApacheCamel文档,我可以使用 ${in.body.replace('

我们有一个JSON字符串作为oData查询的结果返回

  • 我们希望去掉标签上的“@”标志,如
    • @小田
    • 梅斯丹_journaltype@OData.Community.Display.V1.FormattedValue
    • 梅斯丹_endtime@OData.Community.Display.V1.FormattedValue
  • 不触摸电子邮件地址值,如“email”:bob@thebuilder.com“
  • 我在上阅读了ApacheCamel文档,我可以使用

    ${in.body.replace('@', '')}
    
    但电子邮件地址也将被删除

    当然,我可以分多个步骤来做,比如

    ${in.body.replace('msdyn_journaltype@OData.Community.Display.V1.FormattedValue', 'msdyn_journaltypeOData.Community.Display.V1.FormattedValue')}
    
    但这可以做得更好,对吗? 我一直在考虑apachecamel'regex'函数,但我对regex没有太多经验

    知道正则表达式技巧的人

    {
      "@odata.context": "https:\/\/xxx.api.crm4.dynamics.com\/api\/data\/v9.0\/$metadata#bookableresourcebookings(name,msdyn_milestraveled,msdyn_actualarrivaltime,statecode,msdyn_workorder(foc_sapordernumber),Resource(name,foc_sapresourcenumber,email),msdyn_bookableresourcebooking_msdyn_bookingjournal_Booking(msdyn_journaltype,msdyn_name,msdyn_starttime,msdyn_endtime,msdyn_duration,foc_sapstatisticalkeyfigurecod,statecode))",
      "@odata.count": 9,
      "value": [
        {
          "@odata.etag": "W\/\"5775823\"",
          "name": "Wartung 2011153  - Wartung - 181 L1205 Stuttgarter Str.\/Aichbr\u00fccke ",
          "msdyn_milestraveled@OData.Community.Display.V1.FormattedValue": "0,00",
          "msdyn_milestraveled": 0,
          "msdyn_actualarrivaltime@OData.Community.Display.V1.FormattedValue": "30.10.2018 08:55",
          "msdyn_actualarrivaltime": "2018-10-30T08:55:00Z",
          "statecode@OData.Community.Display.V1.FormattedValue": "Active",
          "statecode": 0,
          "bookableresourcebookingid": "bd90b7e6-18dc-e811-a95a-000d3a29f080",
          "msdyn_workorder": {
            "foc_sapordernumber": "856900132812"
          },
          "Resource": {
            "name": "Bob the Builder",
            "foc_sapresourcenumber": "00290035",
            "email": "bob@thebuilder.com"
          },
          "msdyn_bookableresourcebooking_msdyn_bookingjournal_Booking": [
            {
              "@odata.etag": "W\/\"5775798\"",
              "msdyn_journaltype@OData.Community.Display.V1.FormattedValue": "Working Hours",
              "msdyn_journaltype": 690970000,
              "msdyn_name": "Wartung 2011153  - Wartung - 181 L1205 Stuttgarter Str.\/Aichbr\u00fccke ",
              "msdyn_starttime@OData.Community.Display.V1.FormattedValue": "29.10.2018 14:30",
              "msdyn_starttime": "2018-10-29T14:30:00Z",
              "msdyn_endtime@OData.Community.Display.V1.FormattedValue": "29.10.2018 16:00",
              "msdyn_endtime": "2018-10-29T16:00:00Z",
              "msdyn_duration@OData.Community.Display.V1.FormattedValue": "90",
              "msdyn_duration": 90,
              "foc_sapstatisticalkeyfigurecod": "",
              "statecode@OData.Community.Display.V1.FormattedValue": "Active",
              "statecode": 0,
              "_msdyn_booking_value@OData.Community.Display.V1.FormattedValue": "Wartung 2011153  - Wartung - 181 L1205 Stuttgarter Str.\/Aichbr\u00fccke ",
              "_msdyn_booking_value": "bd90b7e6-18dc-e811-a95a-000d3a29f080",
              "msdyn_bookingjournalid": "fd340afc-39dc-e811-a95a-000d3a29f080"
            },
            {
              "@odata.etag": "W\/\"5775795\"",
              "msdyn_journaltype@OData.Community.Display.V1.FormattedValue": "Travel",
              "msdyn_journaltype": 690970002,
              "msdyn_name": "Test WPLAN ohne Vertragstermine III  - Wartung - Bismarckplatz Ost ",
              "msdyn_starttime@OData.Community.Display.V1.FormattedValue": "29.10.2018 13:32",
              "msdyn_starttime": "2018-10-29T13:32:00Z",
              "msdyn_endtime@OData.Community.Display.V1.FormattedValue": "29.10.2018 14:30",
              "msdyn_endtime": "2018-10-29T14:30:00Z",
              "msdyn_duration@OData.Community.Display.V1.FormattedValue": "58",
              "msdyn_duration": 58,
              "foc_sapstatisticalkeyfigurecod": "",
              "statecode@OData.Community.Display.V1.FormattedValue": "Active",
              "statecode": 0,
              "_msdyn_booking_value@OData.Community.Display.V1.FormattedValue": "Wartung 2011153  - Wartung - 181 L1205 Stuttgarter Str.\/Aichbr\u00fccke ",
              "_msdyn_booking_value": "bd90b7e6-18dc-e811-a95a-000d3a29f080",
              "msdyn_bookingjournalid": "d52eafbd-42dc-e811-a95a-000d3a29f080"
            }
          ],
          "msdyn_bookableresourcebooking_msdyn_bookingjournal_Booking@odata.nextLink": "https:\/\/xxx.api.crm4.dynamics.com\/api\/data\/v9.0\/bookableresourcebookings(bd90b7e6-18dc-e811-a95a-000d3a29f080)\/msdyn_bookableresourcebooking_msdyn_bookingjournal_Booking?$select=msdyn_journaltype,msdyn_name,msdyn_starttime,msdyn_endtime,msdyn_duration,foc_sapstatisticalkeyfigurecod,statecode"
        }
      ],
      "msdyn_bookableresourcebooking_msdyn_bookingjournal_Booking@odata.nextLink": "https:\/\/xxx.api.crm4.dynamics.com\/api\/data\/v9.0\/bookableresourcebookings(3931de11-f86d-41a8-b483-c9416d20bf0c)\/msdyn_bookableresourcebooking_msdyn_bookingjournal_Booking?$select=msdyn_journaltype,msdyn_name,msdyn_starttime,msdyn_endtime,msdyn_duration,foc_sapstatisticalkeyfigurecod,statecode"
    }
    

    查看您的数据,我觉得您可以替换所有的
    @
    ,然后是
    OData
    ,前提是您没有将
    OData
    作为域名的电子邮件。因此可以使用这个正则表达式

    (?i)@(?=OData)
    
    (?i)@(?=(?:OData|link|id)\b)
    
    这里,
    (?i)
    确保匹配不区分大小写,
    (?=OData)
    正向前瞻确保
    @
    后面紧跟着
    OData

    并将其替换为空字符串

    让我知道这是否适合你

    编辑:除了
    @OData
    之外,还合并
    @Link
    @Id
    ,并用
    /
    全局替换
    \/
    (而不仅仅是名称属性),您可以使用这个正则表达式,

    (?i)@(?=(?:OData|link|id)\b)|\\(\/)
    
    并将其替换为适用于您的语言的
    $1
    \1

    如果您不想用
    /
    全局替换
    \/
    ,可以使用此正则表达式

    (?i)@(?=OData)
    
    (?i)@(?=(?:OData|link|id)\b)
    
    并将其替换为空字符串


    正如我在评论中所说的,要用名属性中的
    /
    替换
    /
    ,您必须使用一些编程代码。

    太完美了!理论上讲,我们不仅需要替换“@OData”,还需要替换第二个或第三个元素,如“@Link”和“@Id”,或者在“name”元素“\/”中替换为“/”。可以包含在同一个正则表达式中吗?@user2215655:是的,除了
    OData
    之外,还可以在同一个正则表达式中为
    @Link
    @Id
    执行此操作。而且
    \/
    也可以替换为
    /
    ,如果在同一个正则表达式中,那么它将替换所有而不仅仅是name属性。要具体地将名称属性中的
    \/
    替换为
    /
    ,将有点困难,因为它需要可变长度的查找,而这通常是不可用的。让我更新我的答案,以供您评论。