为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Java中将括号内的字符串(嵌套)匹配?

/ 猿问

如何在Java中将括号内的字符串(嵌套)匹配?

qq_笑_17 2019-12-04 13:05:53

我想在括号内匹配一个字符串,例如:


(i, j, k(1))

^^^^^^^^^^^^

该字符串也可以包含封闭的括号。如何在Java中将其与正则表达式匹配而无需编写解析器,因为这只是我项目的一小部分。谢谢!


编辑:


我想寻找一个字符串块,并找到像u(i, j, k),u(i, j, k(1))或者只是u(<anything within this paired parens>)和他们更换到__u%array(i, j, k)和__u%array(i, j, k(1))我的Fortran语言翻译应用。


查看完整描述

3 回答

?
FFIVE

正如我所说的,流行的看法相反(不相信一切人说)匹配嵌套的括号内是可能的正则表达式。


使用它的不利之处在于,您最多只能将嵌套固定到一个水平。对于您希望支持的每个其他级别,您的正则表达式将越来越大。


但是不要相信我。我来给你展示。正则表达式:


\([^()]*\)

匹配一个级别。对于最多两个级别,您需要:


\(([^()]*|\([^()]*\))*\)

等等。为了继续添加级别,您所要做的就是将中间(第二个)[^()]*部分更改为([^()]*|\([^()]*\))*(在此处检查三个级别)。正如我所说,它将越来越大。


你的问题:

对于您的情况,两个级别可能就足够了。因此,其Java代码为:


String fortranCode = "code code u(i, j, k) code code code code u(i, j, k(1)) code code code u(i, j, k(m(2))) should match this last 'u', but it doesnt.";

String regex = "(\\w+)(\\(([^()]*|\\([^()]*\\))*\\))"; // (\w+)(\(([^()]*|\([^()]*\))*\))

System.out.println(fortranCode.replaceAll(regex, "__$1%array$2"));

输入:


code code u(i, j, k) code code code code u(i, j, k(1)) code code code u(i, j, k(m(2))) should match this last 'u', but it doesnt.

输出:


code code __u%array(i, j, k) code code code code __u%array(i, j, k(1)) code code code u(i, j, __k%array(m(2))) should match this last 'u', but it doesnt.

底线:

在一般情况下,解析器会做得更好-这就是人们对此大为恼火的原因。但是对于简单的应用程序,正则表达式就足够了。


注意:某些类型的正则表达式支持嵌套运算符R(Java不支持,而PHPE和Perl等PCRE引擎不支持),它允许您嵌套任意数量的级别。有了他们,您可以执行:\(([^()]|(?R))*\)。


查看完整回答
反对 回复 2019-12-04
?
慕田峪7331174

分工吧 正则表达式为:


([a-z]+)\((.*)\)

第一组将包含标识符,第二组将包含参数。然后这样进行:


private static final Pattern PATTERN = Pattern.compile("([a-z]+)\\((.*)\\)");


// ...


final Matcher m = Pattern.matcher(input);


if (!m.matches())

    // No match! Deal with it.


// If match, then:


final String identifier = m.group(1);

final String params = m.group(2);


// Test if there is a paren

params.indexOf('(') != -1;

用[a-z]+Fortran中可以使用的任何标识符替换。


查看完整回答
反对 回复 2019-12-04
?
慕少森

请检查此答案,因为它基本上可以完成您尝试做的事情(总之,使用正则表达式实际上是不可能的)


查看完整回答
反对 回复 2019-12-04

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信