import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = " *<hashTree>. *<JSONPathAssertion.*?</JSONPathAssertion>. *<hashTree/>. *</hashTree>.";
final String string = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<jmeterTestPlan version=\"1.2\" properties=\"5.0\" jmeter=\"5.1.1 r1855137\">\n"
+ " <hashTree>\n"
+ " <TestPlan guiclass=\"TestPlanGui\" testclass=\"TestPlan\" testname=\"test one\" enabled=\"true\">\n"
+ " <stringProp name=\"TestPlan.comments\"></stringProp>\n"
+ " <boolProp name=\"TestPlan.functional_mode\">false</boolProp>\n"
+ " <boolProp name=\"TestPlan.tearDown_on_shutdown\">true</boolProp>\n"
+ " <boolProp name=\"TestPlan.serialize_threadgroups\">false</boolProp>\n"
+ " <elementProp name=\"TestPlan.user_defined_variables\" elementType=\"Arguments\" guiclass=\"ArgumentsPanel\" testclass=\"Arguments\" testname=\"User Defined Variables\" enabled=\"true\">\n"
+ " <collectionProp name=\"Arguments.arguments\"/>\n"
+ " </elementProp>\n"
+ " <stringProp name=\"TestPlan.user_define_classpath\"></stringProp>\n"
+ " </TestPlan>\n"
+ " <hashTree>\n"
+ " <com.blazemeter.jmeter.threads.concurrency.ConcurrencyThreadGroup guiclass=\"com.blazemeter.jmeter.threads.concurrency.ConcurrencyThreadGroupGui\" testclass=\"com.blazemeter.jmeter.threads.concurrency.ConcurrencyThreadGroup\" testname=\"Thread - main\" enabled=\"true\">\n"
+ " <elementProp name=\"ThreadGroup.main_controller\" elementType=\"com.blazemeter.jmeter.control.VirtualUserController\"/>\n"
+ " <stringProp name=\"ThreadGroup.on_sample_error\">continue</stringProp>\n"
+ " <stringProp name=\"TargetLevel\">${__P(threads, 1)}</stringProp>\n"
+ " <stringProp name=\"RampUp\">${__P(time, 1)}</stringProp>\n"
+ " <stringProp name=\"Steps\">${__P(steps, 1)}</stringProp>\n"
+ " <stringProp name=\"Hold\">${__P(hold, 3)}</stringProp>\n"
+ " <stringProp name=\"LogFilename\"></stringProp>\n"
+ " <stringProp name=\"Iterations\"></stringProp>\n"
+ " <stringProp name=\"Unit\">M</stringProp>\n"
+ " </com.blazemeter.jmeter.threads.concurrency.ConcurrencyThreadGroup>\n"
+ " <hashTree>\n"
+ " <GenericController guiclass=\"LogicControllerGui\" testclass=\"GenericController\" testname=\"Simple Controller - main\" enabled=\"true\"/>\n"
+ " <hashTree>\n"
+ " <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"REQUEST1\" enabled=\"true\">\n"
+ " <boolProp name=\"HTTPSampler.postBodyRaw\">true</boolProp>\n"
+ " <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\">\n"
+ " <collectionProp name=\"Arguments.arguments\">\n"
+ " <elementProp name=\"\" elementType=\"HTTPArgument\">\n"
+ " <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n"
+ " <stringProp name=\"Argument.value\">{
\n"
+ " "version": "1.1",
\n"
+ " "test": {
\n"
+ "}</stringProp>\n"
+ " <stringProp name=\"Argument.metadata\">=</stringProp>\n"
+ " </elementProp>\n"
+ " </collectionProp>\n"
+ " </elementProp>\n"
+ " <stringProp name=\"HTTPSampler.domain\"></stringProp>\n"
+ " <stringProp name=\"HTTPSampler.port\"></stringProp>\n"
+ " <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n"
+ " <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n"
+ " <stringProp name=\"HTTPSampler.path\"></stringProp>\n"
+ " <stringProp name=\"HTTPSampler.method\">POST</stringProp>\n"
+ " <boolProp name=\"HTTPSampler.follow_redirects\">false</boolProp>\n"
+ " <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n"
+ " <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n"
+ " <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n"
+ " <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n"
+ " <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n"
+ " <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n"
+ " </HTTPSamplerProxy>\n"
+ " <hashTree>\n"
+ " <JSONPathAssertion guiclass=\"JSONPathAssertionGui\" testclass=\"JSONPathAssertion\" testname=\"JSON Assertion\" enabled=\"true\">\n"
+ " <stringProp name=\"JSON_PATH\">$.status</stringProp>\n"
+ " <stringProp name=\"EXPECTED_VALUE\">ok</stringProp>\n"
+ " <boolProp name=\"JSONVALIDATION\">true</boolProp>\n"
+ " <boolProp name=\"EXPECT_NULL\">false</boolProp>\n"
+ " <boolProp name=\"INVERT\">false</boolProp>\n"
+ " <boolProp name=\"ISREGEX\">false</boolProp>\n"
+ " </JSONPathAssertion>\n"
+ " <hashTree/>\n"
+ " <JSR223PreProcessor guiclass=\"TestBeanGUI\" testclass=\"JSR223PreProcessor\" testname=\"JSR223 PreProcessor\" enabled=\"true\">\n"
+ " <stringProp name=\"cacheKey\">true</stringProp>\n"
+ " <stringProp name=\"filename\"></stringProp>\n"
+ " <stringProp name=\"parameters\"></stringProp>\n"
+ " <stringProp name=\"script\">// period in the past - year-month-day, set from properties in User Defined Variables\n\n"
+ "import java.time.Instant;\n"
+ "import java.time.temporal.ChronoUnit;\n"
+ "import groovy.json.JsonOutput;\n"
+ "import org.apache.commons.lang.RandomStringUtils;</stringProp>\n"
+ " <stringProp name=\"scriptLanguage\">groovy</stringProp>\n"
+ " </JSR223PreProcessor>\n"
+ " <hashTree/>\n"
+ " <JSR223PostProcessor guiclass=\"TestBeanGUI\" testclass=\"JSR223PostProcessor\" testname=\"JSR223 PostProcessor\" enabled=\"true\">\n"
+ " <stringProp name=\"cacheKey\">true</stringProp>\n"
+ " <stringProp name=\"filename\"></stringProp>\n"
+ " <stringProp name=\"parameters\"></stringProp>\n"
+ " <stringProp name=\"script\">import java.time.Instant;\n"
+ "import java.time.temporal.ChronoUnit;</stringProp>\n"
+ " <stringProp name=\"scriptLanguage\">groovy</stringProp>\n"
+ " </JSR223PostProcessor>\n"
+ " <hashTree/>\n"
+ " </hashTree>\n"
+ " <IfController guiclass=\"IfControllerPanel\" testclass=\"IfController\" testname=\"If Controller\" enabled=\"true\">\n"
+ " <stringProp name=\"IfController.condition\">${__groovy(${random_variable} == 1)}</stringProp>\n"
+ " <boolProp name=\"IfController.evaluateAll\">false</boolProp>\n"
+ " <boolProp name=\"IfController.useExpression\">true</boolProp>\n"
+ " </IfController>\n"
+ " <hashTree>\n"
+ " <RandomController guiclass=\"RandomControlGui\" testclass=\"RandomController\" testname=\"Random Controller\" enabled=\"true\">\n"
+ " <intProp name=\"InterleaveControl.style\">1</intProp>\n"
+ " </RandomController>\n"
+ " <hashTree>\n"
+ " <HTTPSamplerProxy guiclass=\"HttpTestSampleGui\" testclass=\"HTTPSamplerProxy\" testname=\"REQUEST2\" enabled=\"true\">\n"
+ " <boolProp name=\"HTTPSampler.postBodyRaw\">true</boolProp>\n"
+ " <elementProp name=\"HTTPsampler.Arguments\" elementType=\"Arguments\">\n"
+ " <collectionProp name=\"Arguments.arguments\">\n"
+ " <elementProp name=\"\" elementType=\"HTTPArgument\">\n"
+ " <boolProp name=\"HTTPArgument.always_encode\">false</boolProp>\n"
+ " <stringProp name=\"Argument.value\">{
\n"
+ " "version": "1.1",
\n"
+ " "test": {
\n"
+ "}</stringProp>\n"
+ " <stringProp name=\"Argument.metadata\">=</stringProp>\n"
+ " </elementProp>\n"
+ " </collectionProp>\n"
+ " </elementProp>\n"
+ " <stringProp name=\"HTTPSampler.domain\"></stringProp>\n"
+ " <stringProp name=\"HTTPSampler.port\"></stringProp>\n"
+ " <stringProp name=\"HTTPSampler.protocol\"></stringProp>\n"
+ " <stringProp name=\"HTTPSampler.contentEncoding\"></stringProp>\n"
+ " <stringProp name=\"HTTPSampler.path\"></stringProp>\n"
+ " <stringProp name=\"HTTPSampler.method\">POST</stringProp>\n"
+ " <boolProp name=\"HTTPSampler.follow_redirects\">false</boolProp>\n"
+ " <boolProp name=\"HTTPSampler.auto_redirects\">false</boolProp>\n"
+ " <boolProp name=\"HTTPSampler.use_keepalive\">true</boolProp>\n"
+ " <boolProp name=\"HTTPSampler.DO_MULTIPART_POST\">false</boolProp>\n"
+ " <stringProp name=\"HTTPSampler.embedded_url_re\"></stringProp>\n"
+ " <stringProp name=\"HTTPSampler.connect_timeout\"></stringProp>\n"
+ " <stringProp name=\"HTTPSampler.response_timeout\"></stringProp>\n"
+ " </HTTPSamplerProxy>\n"
+ " <hashTree>\n"
+ " <JSONPathAssertion guiclass=\"JSONPathAssertionGui\" testclass=\"JSONPathAssertion\" testname=\"JSON Assertion\" enabled=\"true\">\n"
+ " <stringProp name=\"JSON_PATH\">$.status</stringProp>\n"
+ " <stringProp name=\"EXPECTED_VALUE\">ok</stringProp>\n"
+ " <boolProp name=\"JSONVALIDATION\">true</boolProp>\n"
+ " <boolProp name=\"EXPECT_NULL\">false</boolProp>\n"
+ " <boolProp name=\"INVERT\">false</boolProp>\n"
+ " <boolProp name=\"ISREGEX\">false</boolProp>\n"
+ " </JSONPathAssertion>\n"
+ " <hashTree/>\n"
+ " </hashTree>\n"
+ " </hashTree>\n"
+ " </hashTree>\n"
+ " </hashTree>\n"
+ " </hashTree>\n"
+ " </hashTree>\n"
+ " </hashTree>\n"
+ "</jmeterTestPlan>";
final Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
}
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Java, please visit: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html