将正则表达式应用于数值以替换nifi中的值时出错

时间:2019-06-04 14:40:23

标签: regex apache-nifi

嗨,我有如下数据

[{
   s1 = 98493456645
   s2 = 0000000000
   102 = 93234,
   12 = 
   15 = rahdeshfui
   16 = 2343432,234234
  },
{
   s1 = 435234235
   s2 = 01
   102 = 45336
   12 = 
   15 = vjsfrh@gmail.com
   16 = 2415454
 }
 ]

现在使用reg表达式,我需要更改为json格式,并且我已经尝试过

regexp:-([^\s]+?.*)=((.*(?=,$))+|.*).*

替换值:-"$1":"$2",

对于此值,我得到的输出如下

[{
   "s1":"98493456645",
   "s2":"0000000000",
   "102":"93234,",
   "12":"",
   "15":"rahdeshfui",
   "16":"2343432,234234",
  },
{
   "s1":"435234235",
   "s2":"01",
   "102":"45336",
   "12":"",
   "15":"vjsfrh@gmail.com",
   "16":"2415454"
 }
 ]

但是我的预期输出应该如下

[{
       "s1":98493456645,
       "s2":0,
       "102":93234,
       "12":"",
       "15":"rahdeshfui",
       "16":"2343432,234234",
      },
    {
       "s1":435234235,
       "s2":01,
       "102":45336,
       "12":"",
       "15":"vjsfrh@gmail.com",
       "16":"2415454"
     }
     ]

对于数字,它们不应该在“”中,如果我的值大于0,则需要用单0代替;对于某些值,我的末尾有,,我需要跳过{{ 1}},如果我有一个

1 个答案:

答案 0 :(得分:2)

这可能有点麻烦,但是您想要替换多个内容,因此一种选择可能是使用多个替换项。

请注意,这些模式不考虑开头[{和结束]]或任何嵌套,而只考虑键值部分,因为您的过帐模式用于示例数据。

1。),将键和值用双引号引起来,而不会捕获     末尾的逗号,并与等号匹配,包括周围的字符     空格:

(\S+) = (\S*?),?(?=\n)并替换为"$1":"$2",

Demo

2。)。删除数字周围的双引号,但以0开头的双引号除外:

("[^"]+":)"(?!0+[1-9])(\d+)""并替换为$1$2

Demo

3。)。删除最后一个键值后的逗号:

("[^"]+":)(\S+),(?!\n *"\w+")并替换为$1$2

Demo

4。)将2个或多个零替换为一个零:

("[^"]+":)0{2,}并替换为$10

Demo

这将导致:

[{
   "s1":98493456645,
   "s2":0,
   "102":93234,
   "12":"",
   "15":"rahdeshfui",
   "16":"2343432,234234"
  },
{
   "s1":435234235,
   "s2":"01",
   "102":45336,
   "12":"",
   "15":"vjsfrh@gmail.com",
   "16":2415454
 }
 ]

假定最后一个值"16":"2415454""16":2415454,因为该值仅包含数字。