Javascript 正则表达式来匹配两个相同字符串之间的所有字符串

Javascript 正则表达式来匹配两个相同字符串之间的所有字符串,javascript,regex,Javascript,Regex,我有这根绳子 --这--是--一个--另一个--注释-- 我希望匹配的元素是 “This”、“is”、“one”、“other”和“comment” 我在试这个正则表达式 -\s+([^-]+)\s+- 这给了我匹配的元素 “这个”、“一个”和“评论” 我搜索了其他问题,它们都提供了这样的解决方案,即#A#,我将得到A,但对于#A#B#我也得到A,但在这种情况下,我需要A和B,因为它们都在两个/code>字符之间 我正在测试javascript正则表达式,但我认为解决方案应该与平台/语言无关 S

我有这根绳子
--这--是--一个--另一个--注释--
我希望匹配的元素是 “This”、“is”、“one”、“other”和“comment”

我在试这个正则表达式
-\s+([^-]+)\s+-
这给了我匹配的元素 “这个”、“一个”和“评论”

我搜索了其他问题,它们都提供了这样的解决方案,即
#A#
,我将得到
A
,但对于
#A#B#
我也得到
A
,但在这种情况下,我需要
A
B
,因为它们都在两个
/code>字符之间


我正在测试javascript正则表达式,但我认为解决方案应该与平台/语言无关

STRING([\s\S]*?)(?=STRING|$)
它将匹配
字符串
,然后将任何零个或多个字符(尽可能少)捕获到组1中,直到第一次出现
字符串
*在该单词**之前停止,因为
(?=…)
是一个正向前瞻,作为零宽度断言,不会使用匹配的文本或字符串结尾

模式的一个通用变体是

STRING((?:(?!STRING)[\s\S])*)
它使用一个,
(?:(?!STRING)[\s\s])*
,它匹配任何字符,0次或多次出现,并且不启动
字符串
字符序列

要获取当前解决方案中的所有子字符串,请使用类似

/--\s+([\s\S]*?)(?=\s+--)/g
                ^^^^^^^^^

请注意,
[^--]+
匹配除
-
之外的一个或多个符号,它不匹配任何不等于
--
的文本
[…]
是一个与单个字符匹配的字符类。要匹配从一个字符到模式第一次出现的任何长度的文本,可以使用
[\s\s]*?
构造:任何0+字符,尽可能少(由于延迟的
*?
量词)

JS演示:

var s='--这是--一个--另一个--注释--';
变量rx=/-\s+([\s\s]*?)(?=\s+-)/g;
var m,res=[];
while(m=rx.exec){
res.push(m[1]);
}

控制台日志(res)要阅读所有我将使用的积极前瞻:

const data='--这个--是--一个--另一个--注释--'
const readAll=data=>{
常量正则表达式=/-\s*(.*?)\s*(?=-)/g
const found=[]
让临时工
while(temp=regex.exec(数据)){
找到。推送(临时[1])
}
返回发现
}

console.log(readAll(data))
试试这个
-\s+([^-]+)\s+
,然后手动删除最后两个:这个
[^-]+
将阻止在
中匹配
令人心碎的
令人心碎的--
为什么不只是\w+?注意OP的
[^-]
匹配换行符,而你的
*?
不会。如果你想换行,你可以做(?:\n |。)*?因为[^--]不允许使用一个字符-因为它不是-字符的第二个破折号意味着直到找到为止,请不要使用
(?:\n|])*?
。总有一天你的浏览器会崩溃。请参阅我的答案,以获得将任何字符与JS正则表达式匹配的正确方法。因此,您可以使用
[\s\s]
来获取所有字符,包括新行等。这很聪明:请参阅更多信息。接受答案!感谢您提供积极前瞻的解决方案。前瞻是匹配重叠子字符串的自然方式。此外,匹配任何字符的
[\s\s]
可以替换为本机JS regex
[^]
构造(不是空的),但它是不可移植的
[\s\s]
几乎可以在任何地方使用。我想知道你为什么使用
/-\s+([\s\s]*?)(?=\s+-)/g
而不是
/-\s+([\s\s]*?)\s+(?=-)/g
这是性能原因还是美学原因?@MaciejKozieja:我不认为这很关键,但这很有趣。当然,可以将
\s+
移动到前瞻之外。如果存在真正的性能差异(regex101的步骤数实际上并不能证明任何regex都比另一个好),那么应该在JS环境中设置一个测试。请参阅-性能几乎没有差异。接缝类似