regex.exec() - 无法匹配字符串

时间:2013-08-13 15:23:16

标签: javascript regex

好吧,所以这是交易。我正在使用strapdown来渲染降价帖子。捷联使用marked来解析这些降价帖子,这些帖子又使用正则表达式文字

尝试 扩展标记以包含以下标记“扩展”,如here所述(shoutout to soffes)。

背景信息

字形用于下划线扩展名:/_(.*?)_/
高亮扩展的文字:/==(.*?)==/

下划线测试代码(为清晰起见,省略了一些代码):

var src = "two new features to the marked.js inline lexer. ==highlighted text==, and _underlined text_";
var underline = /_(.*?)_/;
var cap = underline.exec(src);
document.write("<em class='underline'>"+cap[1]+"</em>");

按预期工作(输出<em class="underline">underlined text</em>) 这是重点测试代码(再次,省略了一些东西):

var src = "two new features to the marked.js inline lexer. ==highlighted text==, and _underlined text_";
var highlight = /==(.*?)==/;
var cap = highlight.exec(src);
document.write("<strong class='highlighted'>"+cap[1]+"</strong>");

再次,按预期工作(输出<strong class='highlighted'>highlighted text</strong>)。

问题

标记的内联词法分析器用^开始所有的正则表达式文字。 即:

tag: /^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,
link: /^!?\[(inside)\]\(href\)/,
reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,
strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/

很自然地,我觉得我应该这样做。我修改我的文字:
下划线延伸的字面值:/^_(.*?)_/
高亮扩展的文字:/^==(.*?)==/

然后,突出显示停止匹配。有趣的是,下划线继续匹配

我意识到这可能是一个需要了解标记工作方式的问题,但通常不会有问题......对吗?

更新1

你可以看到我的工作(需要标记.js)here。要查看通过我的附加信息解析标记的标记,您可以查看第658行 here

2 个答案:

答案 0 :(得分:1)

我稍微修改了underlinestronghighlight正则表达式,并将|==添加到text正则表达式以使其正常工作:

text: /^[\s\S]+?(?=[\\<!\[_*`]|==| {2,}\n|$)/,
stronghighlight: /^==([^=]+)==/,
underline: /^_([^_]+)_/

我的jsfiddle测试页面是here。为简单起见,我在开头复制了marked.js并将其编辑到位。

答案 1 :(得分:0)

首先,您再次混合=-:您有stronghighlight: /^--(.*?)--/,但在文本中您有==text==

接下来,看看这一行:

text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/

这定义了正常的文本块。它将“文本”定义为\<![_*之前的任何内容。
您的-=不存在,因此您的格式会被文本块占用。