【问题标题】:regex in a $split() (jsonata) function giving "Regular expression matches zero length string" why?$split() (jsonata) 函数中的正则表达式给出“正则表达式匹配零长度字符串”为什么?
【发布时间】:2021-02-20 05:47:00
【问题描述】:

我有一个如下所示的字符串文本,只要有 新行并且以日期 dd/mm/yyyy 开头,我想拆分文本。

我在 javascript 中使用 jsonata $split() 函数。但是,我收到一个 jsonata 错误,因为以下“正则表达式匹配零长度字符串”。请帮助我如何解决这个问题。

text = "22/03/2012 intro 20/10/2019\n" + 
       "22/03/2012 body\n" + 
       "more body 22/04/2020\n" +
      "22/03/2012 stuff more stuff"


$split(text , /\\r?\\n(?=(?:0[1-9]|[12][0-9]|3[01])[- \\/.](?:0[1-9]|1[012])[- \\/.](?:19|20)\\d\\d)/))
//I want the output to be [ "22/03/2012 intro 20/10/2019",
//                           "22/03/2012 body more body 22/04/2020",
//                           "22/03/2012 stuff more stuff] 
// But my output now is [ "22/03/2012 intro 20/10/2019",
//                           "22/03/2012 body/n + more body 22/04/2020",
//                           "22/03/2012 stuff more stuff]                          

【问题讨论】:

  • 您是否尝试在\n 而不是^ 上进行拆分,因为^ 也匹配字符串的开头。 See if this demo helps。我会进一步逃避模式内的/
  • 嘿@bobblebubble,感谢您的帮助,但事实证明我的输入是一个包含“\n”和“+”的大字符串,因此无法正常工作://

标签: javascript regex parsing split jsonata


【解决方案1】:

使用

$split($replace(text, /(\r?\n)\s*\+\s*(?=\d{2}[- \/.]\d{2}[- \/.]\d{4})|\r?\n\s*\+\s*/g, '$1'), /\r?\n/)

proof

第一个 $replace 删除加号和换行符,并在必要时替换为行尾。

$split 使用回车 + 换行或仅换行进行拆分。

【讨论】:

  • 嘿,非常感谢您的帮助和详细的回答!但是,我的输入已更改,它是一个包含“\n”和“+”的长字符串,所以很遗憾无法使用://
【解决方案2】:

const str = "22/03/2012 intro\n" +
"22/03/2012 body\n" +
"more body\n" +
"22/03/2012 stuff\n" +
"more stuff\n";

console.log(str.match(/^[0-9][0-9][- /.][0-9][0-9][- /.][0-9][0-9][0-9][0-9][a-zA-Z\s]+(?:[a-zA-Z\s]+)/gm));
// Will log ["22/03/2012 intro\n","22/03/2012 body\nmore body\n", "22/03/2012 stuff\nmore stuff\n"]

【讨论】:

  • 嘿,感谢您的帮助,但不幸的是,我的输入是一个包含“\n”和“+”的大字符串,因此无法正常工作://。我现在尝试在输入上运行它,但它只返回第一个元素
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 2015-04-02
  • 2016-04-02
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 2012-06-05
相关资源
最近更新 更多