如何使用正则表达式捕获可选的星号?

时间:2018-10-03 13:39:18

标签: javascript regex

我正在尝试从Markdown中的API获取部分,因此我正在使用以下方法: var chart = new Highcharts.Chart({ chart: { renderTo: 'container', defaultSeriesType: 'pie' }, legend: { enabled: true }, xAxis: { categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] }, series: [{ data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4] , showInLegend: true }] }); // Apply events to text elements (SVG) and spans within the legend (VML + modern browsers with useHTML option). $('.highcharts-legend text, .highcharts-legend span').each(function(index, element) { $(element).hover(function() { chart.tooltip.refresh(chart.series[0].data[index]); },function() { chart.tooltip.hide(); }) }); https://regex101.com/r/r8aiVk/1 此处的结果应该是(?<=\*\*(Test)\*\*)(.*?)(?=\*\*end\*\*),然后是Test。很棒。

这很好用,但是某些标题的末尾有一个星号,这就是我遇到的问题。我用一个正则表达式遍历标题,但我想捕获一个可选的星号。

因此,在下面的示例中,我希望能够捕获星号以及其余的星号: https://regex101.com/r/r8aiVk/2 此处的结果应为this is a test Test*

我尝试了各种不同的方式,例如this is a test和其他一些变体,但是我无法正常工作。

1 个答案:

答案 0 :(得分:1)

JavaScript中的lookbehind实现欺骗了您:为了匹配lookbehind模式,正则表达式迭代器向后移动,并尝试以这种方式匹配其模式。由于它是在每个位置执行的(您的后面是正则表达式中的第一个原子),因此它将检查字符串的开头,然后依次检查***,然后T,等等。一旦与**Test**匹配,就将其称为一天。因此,下一个*.*?一起使用。

您可以使用简单的消费模式来获得所需的东西:

/\*\*(Test\*?)\*\*(.*?)\*\*end\*\*/g

请参见regex demo

此模式将正常处理,从左到右,匹配

  • \*\*-一个**子字符串
  • (Test\*?)-将TestTest*捕获到第1组
  • \*\*-一个**子字符串
  • (.*?)-捕获组2:除换行符以外的任何0+个字符,并且尽可能少
  • \*\*end\*\*-**end**子字符串。