表达式的否定前瞻也包含在搜索中

时间:2017-02-10 02:38:58

标签: regex replace find notepad++

我需要找到并替换已禁用的testNG测试标签,同时还要添加新的注释" disabledTests"进行相同的测试。

这是输入数据集:

    @Test(groups={"endtoend"}, enabled = false)
    @Test(enabled = false, groups={"endtoend"} )
    @Test(groups = {"integration"}, enabled = false) laksdflas
    @Test(groups={"integration","honor"}, enabled = false)
    @Test(enabled=false){}
    @Test(groups={"integration","honor"}, enabled = true)
    @Test(groups={"integration"})

使用Notepad ++这里是查找正则表达式:

((\(|enabled\s*=\s*false).*(groups\s*=\s*)(\{"|")(.*)("\}|").*(enabled\s*=\s*false|)\)|\(enabled\s*=\s*false\))

这是替换正则表达式:

\(enabled=true, groups={"disabledtests","\5"}\)

以下是使用上述查找和替换正则表达式的输出:

@Test(enabled=true, groups={"disabledtests","endtoend"})
@Test(enabled=true, groups={"disabledtests","endtoend"})
@Test(enabled=true, groups={"disabledtests","integration"}) laksdflas
@Test(enabled=true, groups={"disabledtests","integration","honor"})
@Test(enabled=true, groups={"disabledtests",""}){}
@Test(enabled=true, groups={"disabledtests","integration","honor"})
@Test(enabled=true, groups={"disabledtests","integration"})

第五个示例中的额外空白注释不是问题。问题涉及最后两行被替换:

@Test(groups={"integration","honor"}, enabled = true)
@Test(groups={"integration"})

请注意,在输入数据集中,这些测试没有" enabled = false"标签。我需要我的find regex来排除这些情况,这意味着不应该在搜索中返回这些行。

这些情况应该使用负面预测吗?如果是的话,我可以提一些提示吗?

或者,我愿意更好地查找和替换正则表达式而不是我正在使用的正则表达式。

这是所需的输出:

@Test(enabled=true, groups={"disabledtests","endtoend"})
@Test(enabled=true, groups={"disabledtests","endtoend"})
@Test(enabled=true, groups={"disabledtests","integration"}) laksdflas
@Test(enabled=true, groups={"disabledtests","integration","honor"})
@Test(enabled=true, groups={"disabledtests",""}){}
@Test(groups={"integration","honor"}, enabled = true)
@Test(groups={"integration"})

2 个答案:

答案 0 :(得分:1)

(?=.*enabled\s*=\s*false)添加到正则表达式((之后)似乎有效。在第一个(之后,这会在当前行上进行预测,以检查该行是否包含某种形式的' enabled = false'在继续之前。

((?=.*enabled\s*=\s*false)(\(|enabled\s*=\s*false).*(groups\s*=\s*)(\{"|")(.*)("\}|").*(enabled\s*=\s*false|)\)|\(enabled\s*=\s*false\))

答案 1 :(得分:1)

在没有代码修改的情况下,使用IAnnotationTransformer进行所需操作的TestNG方法:

public class MyAnnotationTransformer implements IAnnotationTransformer {

  @Override
  public void transform(ITest annotation, Class<?> testClass,
      Constructor testConstructor, Method testMethod) {

      if (annotation.getEnabled() = false) {
          annotation.setEnabled(true);
          String[] groups = annotation.getGroups();
          String[] newGroups = new String[groups.length + 1];
          newGroups[0] = "disabledtests";
          // copy groups into newGroups
          annotation.setGroups(newGroups);
      }
  }
}