【问题标题】:regexp ignore some context after matching正则表达式匹配后忽略一些上下文
【发布时间】:2018-06-14 03:58:10
【问题描述】:

我想解决 javascript 中的正则表达式:

ignore } 字符由引号包裹的上下文。 但必须匹配引号外的 } 字符。

示例: “这句话{他说'你好,{某人}',她说'你好,{某人}'}得到了一些东西。”

结果: {他说“你好,{某人}”,她说“嗨,{某人}”}

感谢您的帮助

【问题讨论】:

  • 这缺少上下文({} 构造可以嵌套吗?引用的部分是否可以包含转义的" 符号?如果是,转义语法是什么?你是什么库或语言或工具使用?具体来说,正则表达式的风格/语法是什么?),事实上,一个问题(你有一个不太奏效的尝试吗?你卡在某个地方了吗?或者你只是希望我们从头开始编写代码?) .
  • 现在你的“结果”甚至没有出现在输入字符串中。
  • 对不起。我有一个错误。修改它。

标签: javascript regex regex-greedy


【解决方案1】:

上下文有点模糊,但假设您希望结果包含(包括)外部花括号内的所有内容,您可以使用/{.*}/g

这可以在下面看到:

var regex = /{.*}/g;
var string = 'The sentense { he said "hello, {somebody}" } got a something.';

console.log(string.match(regex)[0]);

或者如果你想获取所有三个组件,你可以使用稍微复杂的正则表达式
/({.*(?={))(.*(?<=.*}))(?:.*)}(.*)/g:

分解:

  1. ({.*(?={)) - 将任何内容分组到第二个 {
  2. (.*(?<=.*})) - 抓住内花括号内的所有内容并将其分组
  3. (?:.*) - 将任何内容分组到下一个 }
  4. } - 继续搜索下一个 }(但不要分组)
  5. (.*) - 之后将任何内容分组

这可以在 JavaScript 中看到:

var regex = /({.*(?={))(.*(?<=.*}))(?:.*)}(.*)/g;
var string = 'The sentense { he said "hello, {somebody}" } got a something.';

string.replace(regex, function(match, g1, g2, g3) {
  console.log(match);
  console.log(g1);
  console.log(g2);
  console.log(g3);
});

并且可以看到在 Regex101 here 上工作。

【讨论】:

  • 如果外部大括号之一在引号中,则不起作用。如果字符串包含换行符,则不起作用。
  • 我的第一条评论指的是您的第一个(且未更改的)正则表达式。您的第二个正则表达式只是一个语法错误。
  • 这仅适用于 Chrome v62+:stackoverflow.com/questions/641407/…
  • .. 并且无法处理许多可能的情况:regex101.com/r/ogG3zB/1
猜你喜欢
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 2021-10-08
相关资源
最近更新 更多