在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




