如何匹配至少包含三个单词并且可能包含分隔符的定界句子?

问题描述

我需要匹配一个字符串,该字符串在两侧均以“,”或“ ::”定界。 重要的是要注意,句子本身可以包含“,”和“:”,并且按句子,我的意思是至少两个单词和一个空格。

示例:

test.wav,200,This is a test,or is it?::test 2.wav,test 3.wav::I said: Do not do that,error.wav

预期输出

[
  {
    "groups": [],"match": "This is a test,or is it?"
  },{
    "groups": [],"match": "I said: Do not do that"
  }
]

我尝试过:

1。

(?:,|::)(?:[a-zA-Z0-9\.\-,?!;/\(\)]+\h){2,}.*?(?:,|::)

但这给了我

[
  {
    "groups": [],"match": ",or is it?::"
  }
]
(?<=,|::)

输出

[
  {
    "groups": [],"match": "200,or is it?::"
  },"match": "test 2.wav,test 3.wav::"
  }
]

解决这个问题的正确方法是什么?

解决方法

您可以将此正则表达式与先行和后备条件一起使用:

(?<=,|::)\h*(?:(?!\S*(?:,|::))\S+\h+){3}.*?(?=::|,)

RegEx Demo

RegEx详细信息:

  • (?<=,|::):肯定地说我们在当前位置之前就有,::
  • \h*:匹配0+个空格
  • (?::启动非捕获组
    • (?!\S*(?:,|::)):表示否定断言我们不匹配::,作为下一个非空白单词的一部分
    • \S+\h+:匹配1+个非空格字符串,后跟1+空格
  • ){3}:结束非捕获组。至少与该组匹配3次
  • .*?:匹配0个或多个任意字符(非贪心字符)
  • (?=::|,):肯定表示我们在当前位置之后有,::
,

您还可以使用一种模式来匹配至少2个单词后跟空格,并为第三个单词至少匹配一个字符,而不必在其后跟一个空格。

(?:,|::)\h*\K(?:(?>[^\s,:]+|,(?!,)|:(?!:))+\h+){2,}(?:(?>[^\s,)|:(?!:)))+(?=\h*(?:,|::))

说明

  • (?:,|::)\h*\K匹配,::和可选空格,然后忘记使用\K匹配的内容
  • (?:(?>[^\s,}匹配至少一个不包含,::的单个字符的至少2个“单词”
  • (?:(?>[^\s,)|:(?!:)))+匹配至少一个不包含,::的单个字符的单词
  • (?=\h*(?:,|::))正向查找,声明可选空格,后跟,::

Regex demo