Java 跳过正则表达式分组

Java 跳过正则表达式分组,java,regex,Java,Regex,我添加了一个带有regex“\(.*?\)”的代码来匹配(and)中包含的单词,并替换这些值。 Fr eg:test_value_(obj_id)_(date_created)将被obj_id和date_created的值替换。最终字符串将是“test_value_123_10/23/19”(obj_id值为123,date_created 10/23/19) 但是如果有任何表达式,其中用户需要(和)与最终字符串一起成为值的一部分。例如:test_value_uu((obj_id))u(date

我添加了一个带有regex“\(.*?\)”的代码来匹配(and)中包含的单词,并替换这些值。 Fr eg:test_value_(obj_id)_(date_created)将被obj_id和date_created的值替换。最终字符串将是“test_value_123_10/23/19”(obj_id值为123,date_created 10/23/19)

但是如果有任何表达式,其中用户需要(和)与最终字符串一起成为值的一部分。例如:test_value_uu((obj_id))u(date_created)。 正则表达式模式不起作用,也无法识别组对象id。因此,最终表达式返回为“test_value”((obj_id))\u 10/23/19”
有办法解决吗?

我想这可能会满足您的要求:

    String string1 = "test_value_(obj_id)_(date_created)";
    String string2 = "test_value_((obj_id))_(date_created)";

    String objectId = "123";
    String dateCreated = "10/23/19";

    String result1 = string1.replaceAll("(?<!\\()\\(obj_id\\)(?!\\))", objectId)
            .replaceAll("(?<!\\()\\(date_created\\)(?!\\))", dateCreated);

    String result2 = string2.replaceAll("(?<!\\()\\(obj_id\\)(?!\\))", objectId)
            .replaceAll("(?<!\\()\\(date_created\\)(?!\\))", dateCreated);

    System.out.println(string1 + " --> " + result1);
    System.out.println(string2 + " --> " + result2);

    // prints:
    // test_value_(obj_id)_(date_created) --> test_value_123_10/23/19
    // test_value_((obj_id))_(date_created) --> test_value_((obj_id))_10/23/19
string1=“测试值(obj\u id)\u(创建日期)”;
字符串string2=“测试值(对象id))(创建日期)”;
字符串objectId=“123”;
字符串dateCreated=“10/23/19”;
字符串result1=string1.replaceAll(“(?”+result1);
System.out.println(string2+“-->”+result2);
//印刷品:
//测试值(对象id)测试值(创建日期)-->测试值123测试值19年10月23日
//测试值((对象id))测试值(创建日期)-->测试值((对象id))测试值19年10月23日
将正则表达式更改为

\([^()]*\)
它将只匹配最里面的括号表达式。如果用户提供的字符串将包含不包含要替换的表达式的括号对,则必须对描述要替换的数据的模式更加严格,或者更改所使用的定界字符

你可能想从

\([a-zA-Z_]+\)

作为与括号中的标识符匹配而没有数字的模式。

你能进一步澄清你的问题吗?你能显示你已经拥有的代码吗?我不知道你为什么要使用
“\(.*?)”
当你可以只使用
“test\u value\u(obj\u id)\u(date\u created)”。替换(“obj\u id”,“123”)。替换(“date\u created”(“10/23/19”);
。我假设你做了一些泛型的事情,这样它就可以对所有变量起作用(甚至可能使用反射?),因此你可以使用
\(.*?)
来获取括号内的所有值(一个接一个,这就是为什么现在值包含括号时会出现问题的原因),并将其替换为此变量的值。好的,我不能使用替换的原因是它更通用,表达式由用户设置。为了让大家更清楚,此值列表由用户提供,用于构造值的表达式也由用户设置,以便他们可以随时更改他们需要。用户通过表单提交提交值,这些数据在一个方法中处理。因此,我提供了一个配置,他们可以在其中定义([^()]*?)这实际上对我很有效。感谢帮助。我定义了设置表达式的规则,只是在这个场景中,属性值应该用(,)括起来失败。为了稍微提高性能,我建议从
*?
中删除
,因为现在字符类不能匹配超过它应该匹配的内容。使用惰性量化标记,正则表达式引擎在每次量化标记匹配字符时检查它是否可以匹配正则表达式的其余部分,而贪婪量化标记则可以令牌将尽可能多地匹配,然后回溯,直到正则表达式的其余部分可以匹配为止