regex JavaScript正则表达式中的正向查找

ig9co6j1  于 2023-01-06  发布在  Java
关注(0)|答案(9)|浏览(109)

我有一个文档,需要从中提取一些数据。文档包含如下字符串

Text:"How secure is my information?"

我需要提取文本Text:后面的双引号中的文本

How secure is my information?

如何在Javascript中使用regex执行此操作

r8xiu3jd

r8xiu3jd1#

LookbehindAssert最近已经在JavaScript中完成,并将在下一期ECMA-262规范中发布。Chrome 66(Opera 53)支持LookbehindAssert,但在撰写本文时,其他主流浏览器(caniuse)还不支持LookbehindAssert。

var str = 'Text:"How secure is my information?"',
    reg = /(?<=Text:")[^"]+(?=")/;

str.match(reg)[0];
// -> How secure is my information?

旧的浏览器不支持JavaScript正则表达式中的lookbehind。您必须使用捕获括号来表示类似下面的表达式:

var str = 'Text:"How secure is my information?"',
    reg = /Text:"([^"]+)"/;

str.match(reg)[1];
// -> How secure is my information?

但是,这并不涵盖所有的lookbehindAssert用例。

zpf6vheq

zpf6vheq2#

我只想补充一点:JavaScript支持像(?<= )(?<! )这样的隐藏代码。
但是它确实支持(?= )(?! )这样的监视器。

7fhtutme

7fhtutme3#

您可以执行以下操作:

/Text:"(.*?)"/

说明:

  • Text:":按字面匹配
  • .*?:以非贪婪的方式匹配任何内容
  • ():捕获匹配
  • ":匹配文字"
  • / /:分隔符
krcsximq

krcsximq4#

string.match(/Text:"([^"]*)"/g)
cidc1ykv

cidc1ykv5#

<script type="text/javascript">
var str = 'Text:"How secure is my information?"';
var obj = eval('({'+str+'})')
console.log(obj.Text);
</script>
dl5txlt9

dl5txlt96#

如果你想完全避免使用正则表达式,你可以:

var texts = file.split('Text:"').slice(1).map(function (text) {
  return text.slice(0, text.lastIndexOf('"')); 
});
8aqjt8rx

8aqjt8rx7#

下面是一个示例,展示了如何实现这一点。
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)提取文本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)    ));
fcg9iug3

fcg9iug38#

如果您和我一样,在研究与Cloudinary gem相关的bug时来到这里,您可能会发现以下内容很有用:
Cloudinary最近发布了gem的1.16.0版本,在Safari中,这个版本崩溃了,并显示错误“无效的正则表达式:组说明符名称“无效。
一个错误报告已经提交。同时,我恢复到1.15.0,错误消失了。
希望这能救某人一命。

ejk8hzay

ejk8hzay9#

带lookbehind的正则表达式

regex = /(?<=.*?:).*/g

可用于生成一个包含inputText中所有匹配项的数组(来自Piotr Berebecki的答案):

> 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."'
]

每个匹配项由一行中第一个冒号后的带引号的字符串组成。
在没有lookbehind的情况下,可以使用带组的正则表达式:

regex = /(.*?:)(.*)/g

这样,每个匹配都由一个完整的行组成,行分为两组:第一个包含直到结肠的部分,第二个包含其余部分。

> 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."

相关问题