我需要一个JavaScript正则表达式来匹配以#开头并以\ n#或行尾(以先到为准)结尾的字符串。
样本-https://regex101.com/r/rpjPkl/4
对于以下示例:
范例1:#always: test\n#asdf
结果:具有组#always: test
和always
的test
示例2:#always: test\n#range: [0, 255]
结果:具有组#always: test
和always
的test
和#range: [0, 255]
以及组range
和[0, 255]
我已经尝试了(几个小时...)以下各种版本:
#([a-z]+):(.+)((\\n#)|$)
#([a-z]+):((^\\n#)|$)+
更新1:
如果找到了组结果,则应将其分隔为
\n
。如果无法获得以上分组,则至少需要以下分组结果样本1预期组:
#always: test
样本2个预期组:
#always: test
和#range: [0, 255]
请注意,
\n
可以作为一个组存在,但不能包含在上述组中。更新2
我正在提供一个更详尽的示例,该示例应涵盖(希望)所有情况。
实时示例链接:https://regex101.com/r/rpjPkl/4答案必须针对在此链接中找到的测试字符串进行测试(与示例3相同)。
范例3:
#always: line1\nline#2\n#range: [0, 255]\n#obj: { prop: '#a1',
prop2: 2 }\n#more: "where #2"
预期比赛/组
比赛1:
#always: line1\nline#2
第1组:
always
第2组:
line1\nline#2
比赛2:
#range: [0, 255]
第1组:
range
第2组:
[0, 255]
比赛3:
#obj: { prop: '#a1',
prop2: 2 }
第1组:
obj
第2组:
{ prop: '#a1',
prop2: 2 }
比赛4:
#more: "where #2"
第1组:
more
第2组:
"where #2"
最佳答案
不必尝试捕获重复的模式,您可以先使用换行符对每个样本执行初始拆分,以使匹配更容易。
const samples = [
'#always: test\n#asdf',
'#always: test\n#range: [0, 255]'
]
function foo(sample)
{
// split first, and then iterate over each sentence
return sample.split('\n').map(sentence => {
// this expression is now very basic
return sentence.match(/^#([a-z]+):\s*(.+)/)
// empty matches yield null and will get filtered later
}).filter(match => match !== null)
}
samples.forEach(sample => {
console.log(foo(sample));
})