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

Javascript 正则表达式没有捕获我的整个选择,javascript,regex,Javascript,Regex,我正在处理一个标记化字符串,该标记始终以~~示例~~开头,以~~结束~~。我正在尝试计算一个正则表达式,它将捕获这两个标记。我目前有/~([^])\w+~/,但这只是获取结束令牌,即~~结束~~。下面的例子将澄清我的问题 当前正则表达式/~([^])\w+~/ 示例文本: ~~/文件标题1~~ [第1段/文件标题1]佩伦特式居住者morbi tristique Sentecus et netus et malesuada fames ac turpis egestas。前庭侵权人、世仇、别有用心

我正在处理一个标记化字符串,该标记始终以~~示例~~开头,以~~结束~~。我正在尝试计算一个正则表达式,它将捕获这两个标记。我目前有/~([^])\w+~/,但这只是获取结束令牌,即~~结束~~。下面的例子将澄清我的问题

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

示例文本:

~~/文件标题1~~ [第1段/文件标题1]佩伦特式居住者morbi tristique Sentecus et netus et malesuada fames ac turpis egestas。前庭侵权人、世仇、别有用心者、临时诉讼人、担保人。不要让你的自由人坐在那里。我的生命是永恒的。莫里斯·普莱斯特拉特·埃利芬德·利奥。他是一个聪明的人。威斯康辛州的前庭、调味品、康茂德维塔、奥纳雷西特、威斯康辛州。埃涅亚发酵液、精粹葡萄汁调味品、红莓汁、豆豉箭叶。在turpis枕面部进行非enim治疗。乌特·费利斯。事实上,这是一个错误,是一个错误,是一个错误,是一个错误。阿利奎姆·埃拉特·帕特。Nam dui mi、tincidunt quis、accumsan porttitor、facilisis luctus、metus ~~结束~

当前结果:
我当前仅获取带有当前表达式的最后一个标记~~end~~

所需结果:
我想要~~/Document Heading 1~~和~~~end~~,但是,需要指出的是,这个标记的开头“~~/Document Heading 1~~”可以包含介于~~之间的任何内容,但是标记的结尾“~~end~~”将始终是相同的。

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


应该适合您(当然假设您设置了贪婪标志)

在您的regexp中,您缺少squar brachets中的tilde字符:

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

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

试试这个

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

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

组将有您的起始值和结束值

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

惰性匹配解决方案:

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

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

看。如果字符串的长度很长,则可以使用此选项。
[^~]*
匹配除
~
以外的0+字符,
(?:(?!~)[^~]*
匹配一个
~
的0+序列,该序列后面不跟另一个
~
,然后是除
~
以外的0+字符

var re=/~([^]*?)~~/g;
var str='~~/文件标题1~~\n[第1段/文件标题1]佩伦特斯克居民morbi tristique Sentecus et netus et malesuada fames ac turpis egestas。前庭侵权人、世仇、别有用心者、临时诉讼人、担保人。不要让你的自由人坐在那里。我的生命是永恒的。莫里斯·普莱斯特拉特·埃利芬德·利奥。他是一个聪明的人。威斯康辛州的前庭、调味品、康茂德维塔、奥纳雷西特、威斯康辛州。埃涅亚发酵液、精粹葡萄汁调味品、红莓汁、豆豉箭叶。在turpis枕面部进行非enim治疗。乌特·费利斯。事实上,这是一个错误,是一个错误,是一个错误,是一个错误。阿利奎姆·埃拉特·帕特。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=“+JSON.stringify(res,0,4)+”如果您在全球范围内使用它,这可能会起作用

(~~.*?~~)
~~匹配字符~~按字面意思

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

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

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

g修饰语:全局。所有比赛(第一场比赛不返回)


如果您还没有签出它,那么它是测试这些表达式的一个很好的资源

如果结束标记总是相同的,为什么您还想获取它?我的想法是,我想分割可能在列中具有不同标题的传入上下文,我可以使用它将其插入word文档为什么是向下投票?我认为这很好,我投你一票。它不会匹配
~
s之间的换行符。反正我没有投反对票。@WiktorStribiżew如果你像我在parens中提到的那样添加m标志,它会匹配换行符:)在Ruby中,
m
修饰符是一个DOTALL修饰符,在JS中,它会重新定义
^
$
锚定行为。@WiktorStribiżew哦哇,没有意识到JS正则表达式的行为。谢谢你的启发。不过,只要在其中添加一个or,再加上回车和换行符,我相信这仍然是最简单的方法:)只需注意:这与这里的
~~/Document~1~~~~
不匹配,谢谢。事实上,我没有考虑匹配部分中可能存在的
~
。只需注意:这与
~~/Document~1不匹配这里~
@WiktorStribiżew处理了您的评论:)如果我遗漏了什么,请告诉我。我不认为您的答案遗漏了什么,因为问题有点不清楚:)但是,您的正则表达式不允许在
(~~[^\r\n]+~~)
中使用换行符。此外,似乎不需要非捕获组(您不需要在其上使用任何量词。为什么您认为在
~~开始~~
~~结束~
之间的内容中不可能出现换行符?为什么非捕获组?更新了答案@casimirithippolyte在复制时忘记删除该非捕获组
(~~.*?~~)