const inputText =
`Text:"How secure is my information?"someRandomTextHere
Voice:"Not very much"
Text:"How to improve this?"
Voice:"Don't use '123456' for your password"
Text:"OK just like in the "Hackers" movie."`;
2)提取文本Text:后面的双引号中的数据,以便结果是一个包含所有匹配项的数组,如下所示:
["How secure is my information?",
"How to improve this?",
"OK just like in the \"Hackers\" movie."]
解决方案**
function getText(text) {
return text
.match(/Text:".*"/g)
.map(item => item.match(/^Text:"(.*)"/)[1]);
}
console.log(JSON.stringify( getText(inputText) ));
运行快照以查看工作演示**
const inputText =
`Text:"How secure is my information?"someRandomTextHere
Voice:"Not very much"
Text:"How to improve this?"
Voice:"Don't use '123456' for your password"
Text:"OK just like in the "Hackers" movie."`;
function getText(text) {
return text
.match(/Text:".*"/g)
.map(item => item.match(/^Text:"(.*)"/)[1]);
}
console.log(JSON.stringify( getText(inputText) ));
> inputText.match(regex)
[
'"How secure is my information?"someRandomTextHere',
'"Not very much"',
'"How to improve this?"',
`"Don't use '123456' for your password"`,
'"OK just like in the "Hackers" movie."'
]
> inputText.match(regex)
[
'Text:"How secure is my information?"someRandomTextHere',
'Voice:"Not very much"',
'Text:"How to improve this?"',
`Voice:"Don't use '123456' for your password"`,
'Text:"OK just like in the "Hackers" movie."'
]
要查看组,必须使用.exec方法。第一个匹配如下:
> [...regex.exec(inputText)]
[
'Text:"How secure is my information?"someRandomTextHere',
'Text:',
'"How secure is my information?"someRandomTextHere'
]
要循环遍历所有匹配项并只处理每个匹配项的第二组(即每行冒号后面的部分),请使用类似以下的语句:
> for (var m, regex = /(.*?:)(.*)/g; m = regex.exec(inputText); ) console.log(m[2]);
"How secure is my information?"someRandomTextHere
"Not very much"
"How to improve this?"
"Don't use '123456' for your password"
"OK just like in the "Hackers" movie."
9条答案
按热度按时间r8xiu3jd1#
LookbehindAssert最近已经在JavaScript中完成,并将在下一期ECMA-262规范中发布。Chrome 66(Opera 53)支持LookbehindAssert,但在撰写本文时,其他主流浏览器(caniuse)还不支持LookbehindAssert。
旧的浏览器不支持JavaScript正则表达式中的lookbehind。您必须使用捕获括号来表示类似下面的表达式:
但是,这并不涵盖所有的lookbehindAssert用例。
zpf6vheq2#
我只想补充一点:JavaScript不支持像
(?<= )
或(?<! )
这样的隐藏代码。但是它确实支持
(?= )
或(?! )
这样的监视器。7fhtutme3#
您可以执行以下操作:
说明:
Text:"
:按字面匹配.*?
:以非贪婪的方式匹配任何内容()
:捕获匹配"
:匹配文字"
/ /
:分隔符krcsximq4#
cidc1ykv5#
dl5txlt96#
如果你想完全避免使用正则表达式,你可以:
8aqjt8rx7#
下面是一个示例,展示了如何实现这一点。
1)给定此输入字符串:
2)提取文本
Text:
后面的双引号中的数据,以便结果是一个包含所有匹配项的数组,如下所示:fcg9iug38#
如果您和我一样,在研究与Cloudinary gem相关的bug时来到这里,您可能会发现以下内容很有用:
Cloudinary最近发布了gem的1.16.0版本,在Safari中,这个版本崩溃了,并显示错误“无效的正则表达式:组说明符名称“无效。
一个错误报告已经提交。同时,我恢复到1.15.0,错误消失了。
希望这能救某人一命。
ejk8hzay9#
带lookbehind的正则表达式
可用于生成一个包含
inputText
中所有匹配项的数组(来自Piotr Berebecki的答案):每个匹配项由一行中第一个冒号后的带引号的字符串组成。
在没有lookbehind的情况下,可以使用带组的正则表达式:
这样,每个匹配都由一个完整的行组成,行分为两组:第一个包含直到结肠的部分,第二个包含其余部分。
要查看组,必须使用
.exec
方法。第一个匹配如下:要循环遍历所有匹配项并只处理每个匹配项的第二组(即每行冒号后面的部分),请使用类似以下的语句: