如何在Java中使用正则表达式从命令字符串中读取函数,或者有哪些替代选项?

3
我希望您可以使用函数结构在字符串中执行命令,例如我有三个函数:
go() do() hello()

但是这些函数也有函数体,这些函数体中也可能包含相同的函数。

"go(){do(){go}} do()"

这些函数也可以使用参数。如何在正则表达式中实现这一点?这就像创建一种编程语言。

基本上,这些不是方法,而是从相同的抽象类中实现的所有类。每个类都有一个参数,其类型为相同类别的列表。我的意图就像一个接受括号的计算器。
例如:5*(2+5-(5*9))

我的命令可能会变得复杂:

go(true, 4){do(), hello(){go(){}}

3
为什么这个标签带有几种不同的语言,如果你想要一个正则表达式呢?但是,我认为用正则表达式做不到这一点,因为标准的正则表达式不能支持任意嵌套。我建议使用简单的解析器,虽然更复杂但更灵活。 - gidds
因为任何这些语言的示例都可以。 - Mehran Jalili
看看BeanShell - 脚本化的Java。 - Stewart
你只想解析字符串还是要进行某种执行?花括号的语义是什么?在像Java这样的编程语言中,它将用于声明命令或函数。在你的示例中,你传递了字面值。因此,你要实现什么仍然不明显。你能解释一下吗? - Markus
只是解析。我基本上正在删除按钮,并用文本框替换它,以告诉我的应用程序要做什么。我正在尝试使用我创建的特殊语法来实现这一点。 - Mehranjp73
2个回答

5
如果您想解析具有未定义递归深度的递归语言,则无法使用仅解析正则语言且使用确定有限自动机实现的正则表达式。相反,应该使用类似ANTLR的解析器生成器,支持非正则语法。它包括所有现有编程语言的语法文件,您可以将其用作解析自己语言的示例。
更新:
如果这看起来过于庞大或者对您想要做的事情学习成本过高,您可以在循环中调用正则表达式替换,并从内部到外部解析嵌套结构。伪代码:
while true:
  search any innermost bracket pair (that doesn't contain nested brackets) with regex
  if found:
    parse content of innermost bracket pair
    remove bracket and its content from input or substitute with something w/o brackets
  else:
    parse content of remaining input
    exit loop

我目前正在尝试制作或查找ANTLR的一个简单示例。这很有趣。 - Mehranjp73
1
ANTLR 入门页面 的末尾有一个非常基本的示例。 - Markus

4
根据我的理解,我们在函数内部使用字符串作为函数调用。如果是这样的话,我们可以尝试使用正则表达式RegEx
\w+\([^\)]*\)

\w : 匹配单词字符,即包括a-zA-Z0-9和下划线_

+ : 匹配一个或多个单词字符。

\( : 匹配左括号。

[^\)]* : 匹配零个或多个非斜杠/和右括号)的任意字符。

在线演示(仅供演示目的我使用JavaScript,您可以根据Java进行更改):

const str = "go(){do(){go}} do()";

console.log(str.match(/\w+\([^\)]*\)/g));
// ["go()", "do()", "do()"]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接