当前位置: 首页 > 知识库问答 >
问题:

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

梁和颂
2023-03-14

我想匹配括号内的字符串,如:

(i, j, k(1))
^^^^^^^^^^^^

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

编辑:

我想搜索一个字符串块,找到类似于u(I,j,k)u(I,j,k(1))或只是u的东西(


共有3个答案

许法
2023-03-14

请检查这个答案,因为它基本上就是你想要做的(简而言之,使用regexps是不可能的)

匹配外括号的正则表达式

耿永寿
2023-03-14

把你的工作分开。有正则表达式是:

([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;

用Fortran中的任何标识符替换[a-z]

曹子平
2023-03-14

正如我所说,与流行的观点相反(不要相信人们所说的一切),匹配嵌套括号在regex中是可能的。

使用它的缺点是,你只能达到一个固定的嵌套水平。对于你希望支持的每一个额外级别,你的正则表达式都会越来越大。

但不要相信我的话。让我给你看看。正则表达式:

\([^()]*\)

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

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

等等要继续添加级别,只需将中间(第二个)[^()]*部分更改为([^()]*|\([^()]*\)*(在此处选中三个级别)。正如我所说,它会越来越大。

对于您的情况,两个级别可能就足够了。所以它的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.

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

注意:一些风格的regex支持嵌套操作符R(Java不支持,而像PHP和Perl这样的PCRE引擎支持),它允许嵌套任意数量的级别。有了它们,你可以做:\([^()]|(?R))*\)

 类似资料:
  • 问题内容: 我想在括号内匹配一个字符串,例如: 该字符串也可以包含封闭的括号。如何在Java中将其与正则表达式匹配而不用编写解析器,因为这只是我项目的一小部分。谢谢! 编辑: 我想寻找一个字符串块,并找到像,或者只是和他们更换到和我的Fortran语言翻译应用。 问题答案: 正如我所说的,流行的看法相反(不相信一切人说)匹配嵌套的括号内 是 可能的正则表达式。 使用它的不利之处在于,您最多 只能将

  • 上面的正则表达式返回括号之间的文本。 如: 如何重写上面的正则表达式,所以我提供了一个类似的字符串,它将返回。i、 e带括号的部分,其中包含大括号中的字符串。

  • 期望的行为 我有一个输入验证,除其他外,测试长度(

  • 问题内容: 我想使用Java删除字符串中所有类型的方括号字符(例如:[],(),{})。 我尝试使用此代码: 但这不起作用,请帮助我。 问题答案: 要删除 _ 所有标点符号_ ,包括所有方括号,大括号和方括号…,按问题是:

  • 问题内容: 我有一个样本字符串 我只想要该值而不是(在另一个内部) 如何在Python中以最简单的方式做到这一点?也许通过使用RegEx(我不擅长)? 问题答案: 怎么样: 对我来说,这打印: 请注意,调用会找到与正则表达式的第一个匹配项,因此除非您再次重复搜索,否则它将不会找到。 编辑: 这里的正则表达式是python原始字符串文字,基本上意味着反斜杠不会被视为特殊字符,而是会原样传递给方法。正

  • 我有这样一个文本: 我试图在c#中使用正则表达式来提取嵌套的if/eles-段。 要查找“?”,我使用了: 模式1: 找到“:”我用了: 模式2: