JavaScript正则表达式中的正向查找
我有一个文档,需要从中提取一些数据。文档包含如下字符串JavaScript正则表达式中的正向查找,javascript,regex,Javascript,Regex,我有一个文档,需要从中提取一些数据。文档包含如下字符串 Text:"How secure is my information?" 我需要提取文字text: How secure is my information? 如何使用Javascript中的正则表达式实现这一点最近,Javascript的lookback断言已经完成,将在ECMA-262规范的下一次发布中发布。它们在Chrome66(Opera53)中受支持,但在撰写本文时没有其他主流浏览器支持 var str = 'Text:"Ho
Text:"How secure is my information?"
我需要提取文字text:
How secure is my information?
如何使用Javascript中的正则表达式实现这一点最近,Javascript的lookback断言已经完成,将在ECMA-262规范的下一次发布中发布。它们在Chrome66(Opera53)中受支持,但在撰写本文时没有其他主流浏览器支持
var str = 'Text:"How secure is my information?"',
reg = /(?<=Text:")[^"]+(?=")/;
str.match(reg)[0];
// -> How secure is my information?
但是,这不会涵盖所有的lookback断言用例。最近针对JavaScript完成了lookback断言,并将在ECMA-262规范的下一次发布中发布。它们在Chrome66(Opera53)中受支持,但在撰写本文时没有其他主流浏览器支持
var str = 'Text:"How secure is my information?"',
reg = /(?<=Text:")[^"]+(?=")/;
str.match(reg)[0];
// -> How secure is my information?
string.match(/Text:"([^"]*)"/g)
但是,这不会涵盖所有的lookbehind断言用例。您只需执行以下操作:
string.match(/Text:"([^"]*)"/g)
/Text:"(.*?)"/
说明:
:按字面匹配文本:“
:匹配 非贪婪方式*?
:捕获匹配()
:匹配文字“
”
:分隔符/
/Text:"(.*?)"/
说明:
:按字面匹配文本:“
:匹配 非贪婪方式*?
:捕获匹配()
:匹配文字“
”
:分隔符/
var str='Text:“我的信息有多安全?”;
var obj=eval('({'+str+'}'))
控制台日志(对象文本);
var str='Text:“我的信息有多安全?”;
var obj=eval('({'+str+'}'))
控制台日志(对象文本);
我只想补充一点:JavaScript不支持像(?)这样的外观落后?
但是它确实支持类似于(?=)
或(?!)
的外观。我只想补充一点:JavaScript不支持类似于(?)的外观?
但它确实支持类似于(?=)
或(?!)
的外观。如果要避免使用正则表达式,可以执行以下操作:
var texts = file.split('Text:"').slice(1).map(function (text) {
return text.slice(0, text.lastIndexOf('"'));
});
如果要避免使用正则表达式,可以执行以下操作:
var texts = file.split('Text:"').slice(1).map(function (text) {
return text.slice(0, text.lastIndexOf('"'));
});
下面是一个示例,展示了如何实现这一点
1) 给定此输入字符串:
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) 在文本文本:
之后提取双引号中的数据,以便结果是一个包含所有匹配项的数组,如下所示:
["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=
`文本:“我的信息有多安全?”此处
声音:“不太喜欢”
课文:“如何改进?”
语音:“不要使用“123456”作为密码”
文字:“好的,就像《黑客》电影中一样。”;
函数getText(text){
返回文本
.match(/Text:'%1!'/g)
.map(item=>item.match(/^Text:(.*)/)[1]);
}
log(JSON.stringify(getText(inputText))代码>下面是一个示例,展示了如何实现这一点
1) 给定此输入字符串:
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) 在文本文本:
之后提取双引号中的数据,以便结果是一个包含所有匹配项的数组,如下所示:
["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=
`文本:“我的信息有多安全?”此处
声音:“不太喜欢”
课文:“如何改进?”
语音:“不要使用“123456”作为密码”
文字:“好的,就像《黑客》电影中一样。”;
函数getText(text){
返回文本
.match(/Text:'%1!'/g)
.map(item=>item.match(/^Text:(.*)/)[1]);
}
log(JSON.stringify(getText(inputText))代码>如果您和我一样,在研究与Cloudinary gem相关的bug时来到这里,您可能会发现以下内容很有用:
Cloudinary最近发布了其gem的1.16.0版。在Safari中,这会崩溃,错误为“无效的正则表达式:无效的组说明符名称”
一份错误报告已经存档。与此同时,我恢复到1.15.0,错误消失了
希望这能挽救一些人的生命。如果你和我一样,在这里研究与Cloudinary gem相关的bug,你可能会发现这很有用:
Cloudinary最近发布了其gem的1.16.0版。在Safari中,这会崩溃,错误为“无效的正则表达式:无效的组说明符名称”
一份错误报告已经存档。与此同时,我恢复到1.15.0,错误消失了
希望这能挽救一些人的生命。这不是向后看(甚至是向前看)。带向后看的正则表达式会是什么样子?@MattBall,你怎么看?可以在一个或多个字符上匹配文本的lookback:“
和的lookahead”(
)。我想我可以理解将lookahead作为一种解决方案,但它更适合于分组括号。i、 e./Text:([^”]*)“/
这不是向后看(甚至是向前看)。带向后看的正则表达式看起来如何?@MattBall,你怎么看?可以在一个或多个字符上匹配文本:
的向后看和的向前看“
。我想我能理解将lookbehind作为解决方案的想法,但它更适合分组括号。i、 e./Text:([^“]*)”/
你如何使用它?你有一些上下文吗?那就是正则表达式,你应该将它与例如一起使用。match()你如何使用它?你有一些上下文吗?那就是正则表达式,你应该将它与例如一起使用。match()但是我如何从一个大文档中提取所有这样的数据呢?比如说,提取到一个数组或其他什么东西中?嗯。当我测试上述代码时,我得到一个未定义的值。当我在没有索引1的情况下控制台str.match(reg)
时,它会输出[“文本:“我的信息有多安全?”