正则表达式没有捕获我的整个选择

时间:2016-06-13 18:06:25

标签: javascript regex

我正在使用一个标记化的字符串,该标记始终以~~示例~~开头,以~~结束~~结束。我正在尝试制作一个能抓住两个令牌的正则表达式。我目前有/ ~~([^])\ w + ~~ /但这只是抓取结束标记~~结束~~。以下示例将澄清我的问题。

当前正则表达式 /~~([^])\w+~~/

示例文字:

~~ /文件标题1 ~~ [第1段/文件标题1] Pellentesque居民morbi tristique senectus et netus et malesuada fames ac turpis egestas。 Vestibulum tortor quam,feugiat vitae,ultricies eget,tempor sit amet,ante。 Donec eu libero坐在amet quam egestas semper。 Aenean ultricies mi vitae est.Mauris placerat eleifend leo。 Quisque坐在amet est et sapien ullamcorper pharetra。 Vestibulum erat wisi,condimentum sed,commodo vitae,ornare sit amet,wisi。 Aenean fermentum,elit eget tincidunt condimentum,eros ipsum rutrum orci,sagittis tempus lacus enim ac dui。 Donec non enim in turpis pulvinar facilisis。 Ut felis。 Praesent dapibus,neque id cursus faucibus,tortor neque egestas augue,eu vulputate magna eros eu erat。 Aliquam erat volutpat。 Nam dui mi,tincidunt quis,accumsan porttitor,facilisis luctus,metus ~~结束~~

当前结果:
我目前只使用当前表达式抓取最后一个令牌~~ end ~~。

期望的结果:
我想两个~~ /文件标题1 ~~和~~结束~~,但是,重要的是要指出这个标记的开头" ~~ /文件标题1 ~~"可以包含任何东西~~然而令牌的结尾" ~~结束~~"永远都是一样的。

5 个答案:

答案 0 :(得分:3)

/~~(.|[\r\n])*?~~/

应该适合你(假设你当然设置了贪婪的旗帜)

答案 1 :(得分:3)

您可以使用2个正则表达式匹配2个mutlicharacter分隔符之间的任何内容。

懒惰的匹配解决方案:

/~~([^]*?)~~/g

请参阅regex demo。这也可以写为/~~([\s\S]*?)~~/g,并尽可能少地捕获前导~~和尾随~~之间的任何0+字符。

另一种方法是使用否定的字符类(展开延迟匹配模式):

/~~([^~]*(?:~(?!~)[^~]*)*)~~/g

another regex demo。如果您有很长的字符串,这个替代方案很好用。 [^~]*匹配除~以外的0 +字符,而(?:~(?!~)[^~]*)*匹配~的0 +序列,其中没有跟随另一个~,然后是0+ ~以外的字符。

var re = /~~([^]*?)~~/g; 
var str = '~~/Document Heading 1~~\n[Paragraph 1 /Document Heading 1]Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus\n~~end~~ \n';
var res = [];
while ((m = re.exec(str)) !== null) {
    res.push(m[1]);
}
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";

答案 2 :(得分:3)

如果您使用全球

,这可能会有效
(~~.*?~~)

~~ 匹配字符~~字面意思

。*?匹配任何字符(换行符除外)

量词:*?在零和无限次之间,尽可能少的时间,根据需要扩展[懒惰]

~~ 匹配字符~~字面意思

g修饰符:全局。所有比赛(首场比赛都没有回归)

如果您还没有检查出来https://regex101.com/是测试这些表达式的绝佳资源

答案 3 :(得分:2)

在你的正则表达式中,你缺少了方形brachets中的波浪形字符:

/~~([^~]+)~~/mg

您可以在以下位置测试您的表达式:

https://regex101.com/

答案 4 :(得分:1)

试试这个

(~~.*?~~)(?:.|\n|\r)*?(~~end~~)

OutPut

Match 1
1.  ~~/Document Heading 1~~
2.  ~~end~~
Match 2
1.  ~~/Document Heading 1~~
2.  ~~end~~

群组将包含您的开始和结束值