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?
但是,这不会涵盖所有的lookbehind断言用例。

您只需执行以下操作:

string.match(/Text:"([^"]*)"/g)
/Text:"(.*?)"/
说明:

  • 文本:“
    :按字面匹配
  • *?
    :匹配 非贪婪方式
  • ()
    :捕获匹配
  • :匹配文字
  • /
    :分隔符

var str='Text:“我的信息有多安全?”;
var obj=eval('({'+str+'}'))
控制台日志(对象文本);

我只想补充一点:JavaScript不支持像
(?)这样的外观落后?

但它确实支持类似于
(?=)
(?!)

的外观。如果要避免使用正则表达式,可以执行以下操作:

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]);
}

console.log(JSON.stringify(getText(inputText));
如果您像我一样,在研究与Cloudinary gem相关的bug时来到这里,您可能会发现这很有用:

Cloudinary最近发布了其gem的1.16.0版。在Safari中,该版本崩溃,错误为“无效的正则表达式:无效的组说明符名称”

一个错误报告已经存档。在此期间,我恢复到1.15.0,错误消失了


希望这能挽救一些人的生命。

这不是向后看(甚至是向前看)。带向后看的正则表达式会是什么样子?@MattBall,你怎么看?可以在一个或多个字符上匹配
文本的向后看:
的向前看“
。我想我能理解将lookbehind作为解决方案的想法,但它更适合分组括号。i、 e.
/Text:([^”]*)”/
你如何使用它?你有什么上下文吗?那就是正则表达式,你应该将它与.match()一起使用,但是我如何从一个大文档中提取所有这样的数据?比如说,提取到数组或其他什么东西中?嗯。当我测试上述代码时,我得到一个未定义的值。当我控制台
str.match(reg)时
如果没有索引1,它将输出
[“文本:“我的信息有多安全?”]
Thinks?@orangewarp:g
修饰符需要删除,这是我的答案中的示例。酷。有效。为什么g修饰符会删除捕获括号?我想知道,因为我可以想象一个场景,在一个字符串中可能有多个目标。
str='Something more things@orangewarp:这是标准行为r表示与全局标志匹配。它基本上在后台重复调用
exec
,每次迭代只返回结果数组中的第一个元素。最好的解决方案可能是运行自己的循环,调用
RegExp.prototype.exec
,自己解析结果,或者使用该方法(两者大致相同,但在某些情况下后者提供了更多的便利)。如何避免匹配文本:在结果中?字符串[0]将始终具有完整的正则表达式匹配。字符串[1]将具有捕获的文本。如果正则表达式中有第二个捕获(括号),则将其放入字符串[2]等…我认为使用/g标志,您将只获得所有匹配项的完整正则表达式匹配。g修饰符将查找页面上匹配的所有内容,而不只是在第一次匹配时停止。您说过您有字符串(复数),因此我将/g修饰符放在那里。现代浏览器也有,这可能比
eval
更受欢迎。
["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)    ));