You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在JMeter的JSR223后置处理器中使用Groovy为字符串变量分配带分组的正则表达式时出现编译错误

问题分析

你遇到的编译错误根源是代码中使用了HTML实体",Groovy编译器完全无法识别这个转义字符,它会把"当成非法输入,所以抛出了Unexpected input: '"'的错误。

另外,你提到要做部分字符串提取,但当前用的minus方法并不适合处理正则匹配的内容——minus是用来做字符串/集合的直接减法操作,而正则匹配的内容需要用Matcher来提取分组,或者用replaceAll来移除匹配部分。

修正后的代码

下面是两种可行的写法,你可以根据需求选择:

写法1:用单引号包裹正则(推荐,无需转义双引号)

def res = prev.getResponseDataAsString();
// 直接用实际的双引号,用单引号包裹整个正则表达式
def strRegExp = ~',"action"(.*?)}'

// 1. 如果要提取分组内容(比如捕获(.*?)的部分)
def matcher = res =~ strRegExp
if (matcher.find()) {
    // group(1)对应第一个捕获组的内容
    def extractedActionContent = matcher.group(1)
    log.info("提取到的action内容:${extractedActionContent}")
}

// 2. 如果要移除匹配的部分(替代原来的minus方法)
def strRel = res.replaceAll(strRegExp, '')

写法2:用双引号包裹正则,需要转义内部的双引号

def res = prev.getResponseDataAsString();
// 双引号包裹的字符串里,内部双引号要加反斜杠转义
def strRegExp = ~",\"action\"(.*?)}"

// 后续提取或移除操作和上面一致
def matcher = res =~ strRegExp
if (matcher.find()) {
    def extractedActionContent = matcher.group(1)
    log.info("提取到的action内容:${extractedActionContent}")
}
def strRel = res.replaceAll(strRegExp, '')
关键说明
  • 永远不要在Groovy代码里直接写",这是HTML的转义字符,只有在HTML文档里才会被解析成双引号,Groovy编译器完全不认识它。
  • 正则表达式的分组提取必须通过Matcher对象的group()方法来获取,minus方法无法实现正则匹配内容的提取或移除。
  • 如果你需要匹配的内容里有.*这类正则元字符,记得在正则里做相应转义。

内容的提问来源于stack exchange,提问作者DEVIL FF

火山引擎 最新活动