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)
时,它会输出
[“文本:“我的信息有多安全?”