【问题标题】:How to make regular expression unique for multiple values如何使正则表达式对多个值唯一
【发布时间】:2019-02-03 03:42:08
【问题描述】:

我的回复在 2 个地方具有相同的值,例如

http://images.123456_120*75
http://images.123456_120*75
http://images.784217_120*75
http://images.784217_120*75

在此我只需要捕获 123456 和 784217 一次。

我使用正则表达式作为 http://images.(.+?)_120*75 提取所有 4 个值。但我担心我需要每个值 2 中的一个。你能帮我吗 提前谢谢?

【问题讨论】:

    标签: regex jmeter


    【解决方案1】:

    一种方法是让 2 个后处理器 使用相同的正则表达式。现在,在 1st 常规提取器中使用 Match No: 值作为 1 并在 2nd 中使用 Match否: 值为 4

    希望这会有所帮助。

    【讨论】:

    • 但是如果不知道每个值的索引号呢?
    • 没关系,但我们需要将每个变量传递一次,如图所示。但我的回复中不仅有 2 个值,实际上还有很多我想让它们独一无二并希望一次通过
    【解决方案2】:

    使用正则表达式非常棘手,我建议改用JSR223 PostProcessorGroovy language

    1. 将 JSR223 PostProcessor 添加为返回上述图像 URL 的请求的子项
    2. 将以下代码放入“脚本”区域

      (prev.getResponseDataAsString() =~ "http://images.(\\d+)_120\\*75").findAll().unique().eachWithIndex {match, idx ->
          vars.put('image_' + idx,match.get(1))
      }
      
    3. 如果一切顺利,您应该会看到以下JMeter Variables 生成:

      image_0=123456
      image_1=784217
      etc.
      

    【讨论】:

    • thnku Dmitri 我会试试这个并告诉你。
    • 它给出了 regex.patternsyntaxexception: 索引 75 附近非法/不受支持的转义序列
    【解决方案3】:

    这应该可行,它只捕获一次唯一值:

    (\d+)(?:_)(?![\s\S]*\1)
    

    Try Demo here

    解释

    (\d+)(?:_)(?![\s\S]*\1)

    第一抓捕组 (\d+)

    \d+ 匹配一个数字(等于[0-9]

    • 量词 - 匹配一次到无限次,尽可能多次,按需回馈(贪婪)

    非捕获组 (?:_)

    _ 匹配字符 _ 的字面意思(区分大小写)

    负前瞻 (?![\s\S]*\1)

    断言下面的正则表达式不匹配 匹配下面列表中的单个字符[\s\S]*

    • 量词 - 在零次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)

    \s 匹配任何空白字符(等于[\r\n\t\f\v ]

    \S 匹配任何非空白字符(等于[^\r\n\t\f\v ]

    \1 匹配第一个捕获组最近匹配的相同文本

    【讨论】:

    • 要捕获的 id 是动态的
    • @user7294900 但你的问题是这样的。你知道他们的范围吗?
    • 上面的表达式没问题,但我不知道响应中应该包含的值,并且不仅有 2 个值,还有很多重复的值,我想让所有值都独一无二
    • @biyyapu 你现在可以试试,它正在捕获多个唯一值。
    • @biyyapu 我不是 OP,biyyapu 应该说它是否有效
    【解决方案4】:

    也许您可以在一组中捕获整个匹配项并在第二组中捕获数字。然后使用负前瞻断言第 1 组中捕获的内容不再发生,从而为您提供唯一值。

    您要匹配的数字在捕获组 2 中。请注意,要匹配点 . 和星号 *,您必须将它们转义。

    (http://images\.(\d+)_120\*75)(?![\s\S]*\1)

    Regex demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 2018-12-24
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      相关资源
      最近更新 更多