【问题标题】:Matching a string inside another string在另一个字符串中匹配一个字符串
【发布时间】:2020-12-12 05:53:23
【问题描述】:

我创建了一个正则表达式来匹配一个字符串,现在我需要从字符串中提取n次一组字符。

类似这样的:

{"Group 1":{"Name":"A","Name":"B",....,"Name":"Z"},{"Group 2":{"Name":"AA","Name":"BB",....,"Name":"ZZ"}}

我现在创建了正则表达式 \\"Group 1.\*?\\},我想只使用这条规则 Name\\":\\"(.\*?)\\" 从组 1 中提取所有名称。

如果我使用\\"Group 1.\*?Name\\":\\"(.\*?)\\".\*?\\},它只会提取第一个结果,但我需要所有结果。

有什么想法吗?谢谢

【问题讨论】:

  • 为此使用 JSON 解析器,而不是正则表达式。
  • 这是 JSON 解析器的经典案例。你使用什么语言?
  • 它不是 JSON,它是 JS,我使用的是 Python,我只需要一个正则表达式,它只是一个例子而不是真实的情况,真正的字符串是一个 HTML 的 JS,太大了,放不下
  • 这其实是一个有趣的问题。 preg_match_all('#\{"Group.*?\:\{("Name"\:"([a-z]*)").*?\}#i', $str, $matches); 仅返回 A 和 AA。有一种方法可以通过正确插入 ?R 来获得您想要的东西,但我无法弄清楚。 stackoverflow.com/questions/8440911/recursive-php-regex
  • 谢谢@anjanesh,看起来不错

标签: regex


【解决方案1】:

仅限深度 1。不是 n 深度的正确解决方案。

<?php
$str = '{"Group 1":{"Name":"A","Name":"B",....,"Name":"Z"}},{"Group 2":{"Name":"AA","Name":"BB",....,"Name":"ZZ"}}';

# preg_match_all('#\{"Group.*?\:\{("Name"\:"([a-z]*)").*?\}\}#i', $str, $matches);
# print_r($matches);

preg_match_all('#\{"Group.*?\:\{(.*?)\}\}#i', $str, $matches_outer);
print_r($matches_outer);
foreach ($matches_outer[1] as $m)
{
    preg_match_all('#"Name"\:"([a-z]*)".*?#i', $m, $matches);
    print_r($matches);
}
?>

另外,您在原始字符串中遗漏了一个 },"Name":"Z"}

之后应该有一个}
{"Group 1":{"Name":"A","Name":"B",....,"Name":"Z"}},{"Group 2":{"Name":"AA","Name":"BB",....,"Name":"ZZ"}}

【讨论】:

    猜你喜欢
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2013-05-16
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多