我需要一个JavaScript正则表达式来匹配以#开头并以\ n#或行尾(以先到为准)结尾的字符串。

样本-https://regex101.com/r/rpjPkl/4

对于以下示例:

范例1:#always: test\n#asdf

结果:具有组#always: testalwaystest

示例2:#always: test\n#range: [0, 255]

结果:具有组#always: testalwaystest

#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));
})

10-06 06:55