问题描述
我需要匹配一个字符串,该字符串在两侧均以“,”或“ ::”定界。 重要的是要注意,句子本身可以包含“,”和“:”,并且按句子,我的意思是至少两个单词和一个空格。
示例:
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详细信息:
-
(?<=,|::)
:肯定地说我们在当前位置之前就有,
或::
-
\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*(?:,|::))
正向查找,声明可选空格,后跟,
或::