【问题标题】:Regex newbie question on start and end of captures关于捕获开始和结束的正则表达式新手问题
【发布时间】:2010-11-21 08:12:55
【问题描述】:

我需要一些关于正则表达式的帮助。请看下面的例子。我正在捕获包含在这之间的特定摆脱值

“,“孩子们”:[

并以此结束

}]}]}

如下图。

我的问题是下面显示的块会重复多次,我只希望每个块的 ","children":[ to }]}]} 开始之间的所有摆脱。

我知道我可以通过 rid":"([\w\d\-\."]+) 获取个人摆脱价值

但我不知道如何指定捕获在","children":[ 开头到}]}]} 之间存在的所有rid":"([\w\d\-\."]+)

例子:

","children":[{"type":"stub","context":"","rid":"b1c4922237ce.ee6a3644443fe.10711226e93.d0af7aadbd0-4be3-4353ddd.8b47.f2f4aaf2474f","metaclass":" ASAPModel.BarrierCategory"}, {"type":"stub","context":"","rid":"b1c497ce.ee6a64fe.290c6e93.91c15f91-a1c-4c36.9939.4ab7b94a39ad","metaclass":"ASAPModel.BarrierCategory"}, {"type":"stub","context":"","rid":"b1c497ce.ee6a64fe.27c3ee93.22e90c22-7406-463a.8bff.f6ea88f6ffcc","metaclass":"ASAPModel.BarrierCategory"}, {"type":"stub","context":"","rid":"b1c497ce.ee6a64fe.6a182e93.5c0e7d5c-ff65-451d.afc0.cfc7fbcfc02d","metaclass":"ASAPModel.BarrierCategory"}, {"type":"stub","context":"","rid":"b1c497ce.ee6a64fe.6970ae93.8ea3978e-112b-4bbb.8405.d17071d105d2","metaclass":"ASAPModel.BarrierCategory"}]} ]}, ","children":[{"type":"stub","context":"","rid":"b1c4922237ce.ee6a3644443fe.10711226e93.d0af7aadbd0-4be3-4353ddd.8b47.f2f4aaf2474f","metaclass":" ASAPModel.BarrierCategory"}, {"type":"stub","context":"","rid":"b1c497ce.ee6a64fe.290c6e93.91c15f91-a1c-4c36.9939.4ab7b94a39ad","metaclass":"ASAPModel.BarrierCategory"}, {"type":"stub","context":"","rid":"b1c497ce.ee6a64fe.27c3ee93.22e90c22-7406-463a.8bff.f6ea88f6ffcc","metaclass":"ASAPModel.BarrierCategory"}, {"type":"stub","context":"","rid":"b1c497ce.ee6a64fe.6a182e93.5c0e7d5c-ff65-451d.afc0.cfc7fbcfc02d","metaclass":"ASAPModel.BarrierCategory"}, {"type":"stub","context":"","rid":"b1c497ce.ee6a64fe.6970ae93.8ea3978e-112b-4bbb.8405.d17071d105d2","metaclass":"ASAPModel.BarrierCategory"}]} ]},

我的问题是我不明白如何指定非捕获组的开始和结束值,以及如何识别这些捕获组中的一个或多个,有点像[]+

【问题讨论】:

  • 建议用四个空格缩进你的数据,这样可以格式化它以更有用地显示。
  • 感谢您提供示例数据。您是否还可以提供一个您想要捕获的样本?
  • 更新了我想要捕捉的内容...
  • @MaxiePaxie 你想用 Perl 还是 JavaScript 来做这个?
  • @Sinan 抱歉,我认为我在标记这个 perl 时不准确。 Jmeter 使用 Jakarta-ORO Java 类和 'Per like' 匹配 sytanx。很抱歉从问题中删除 perl 标记的混乱..

标签: regex jmeter


【解决方案1】:

这看起来像JSON(尽管您的示例数据不完整,无法有效)。

如果是这样,那么来自CPANJSON 模块可能是最好的前进方式:

use strict;
use warnings;
use JSON qw( from_json );

# my example data
my $data = q( [ 
    {"children":[ {"type":"stub","rid":"aa"}, {"type":"stub2","rid":"bb"} ] }, 
    {"children":[ {"type":"stub","rid":"cc"}, {"type":"stub2","rid":"dd"} ] } ]
);

my $json = from_json( $data );

for my $rec ( @$json ) {
    for my $child ( @{ $rec->{children} } ) {
        say "rid: ", $child->{rid};
    }
}

打印出来:

摆脱:aa 摆脱:bb 摆脱:cc 摆脱:dd

【讨论】:

  • 同意。有些地方正则表达式只会令人沮丧。
【解决方案2】:

你需要把它分成两个步骤:

  1. 获取数据长度
  2. 摆脱困境

    # Make sure you get the first one
    my ( $child ) = $record =~ m/"children":\[([^\]]+)\]/g;
    # Get all in span - the g operator tells the regex to get all ( 'global' )
    my @rids     = $child =~ m/"rid":"([^"]+)"/g; # <-- g operator
    

但对我来说它看起来像 JSON,您可以使用 JSON::Syck 解析这样的数据

【讨论】:

  • 它是来自dojo树的reposne,我正在使用使用perl正则表达式的Jmeter。我需要将更多请求(即动态 http 请求数量)与动态 rid 值关联起来......
  • @unknown:所以您想知道如何使用正则表达式完全做到这一点?这绝对不是一个简单的方法。
  • @Axeman 我总是被告知在正则表达式中一切皆有可能......世界和平,太空旅行,甚至复杂的解析......
  • @MaxiePaxie 你被告知错了。 @Axeman 恐怕他正试图在 Javascript 中执行此操作,而不是 Perl。
【解决方案3】:

类似\",\"children\":(.*)(?=\\]\\}\\]\\})的东西

玩弄它

论坛正在吸收我的一些反斜杠,警告要为其他人加倍努力

响应编辑

尝试先将数据分成括号内的组,然后在 for 循环中对每个组进行一次搜索。您可以使用正则表达式组一次获取所有组。

【讨论】:

  • 如果您使用 `...` 将字符串标记为代码,则反斜杠将正常显示
猜你喜欢
  • 2021-08-05
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
相关资源
最近更新 更多