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环境中设置一个测试。请参阅-性能几乎没有差异。接缝类似