1

考虑以下脚本(在伪语言中完全是胡说八道):

if (Request.hostMatch("asfasfasf.com") && someString.existsIn(new String[] {"brr", "hrr"}))   {
    if (Requqest.clientIp("10.0.x.x")) {
        somevar = "1";
    }
    somevar = "2";
}
else {
    somevar = "first";
}
string foo = "foo";
// etc. etc.

你将如何从中获取 if-block 的参数和内容?if 块的格式为:

if<whitespace>(<parameters>)<whitespace>{<contents>}<anything>

我尝试使用String.split()正则表达式模式,^if\s*\(|\)\s*\{|\}\s*但这失败了。即,问题在于) {内部 if-block 中也发现了该问题,并且在}许多地方也发现了关闭。我认为懒惰或急切的扩张在这里都行不通。

所以......任何指向我在这里可能需要什么才能用正则表达式实现它的指针?

我还需要在没有 if-block 代码的情况下获取剩余的字符串(所以代码从 开始else { ...)。使用 justString.split()似乎很困难,因为没有关于被解析部分的长度的信息。

我最初为此创建了一个基于循环的解决方案(String.substring()大量使用),但它很乏味。我想要一些更高级的东西。我应该使用正则表达式还是创建一个自定义的通用函数(除此之外还有许多其他情况),它采用可解析的字符串和模式(考虑if<whitespace>(...上面的模式)?

编辑:更改返回变量赋值,否则没有意义。

4

3 回答 3

2

使用(或编写)解析器比尝试使用 Regex 执行此操作要好得多。

正则表达式非常适合某些东西,但对于像这样的复杂解析,它很糟糕。另一个在这里被问到很多问题的例子是解析 HTML——你可以在有限的程度上做到这一点,但对于任何复杂的事情,DOM 解析器是一个更好的解决方案。

对于 [非常] 简单的解析器,您需要的是一个递归函数,它搜索大括号{},每次遇到左大括号时向下递归一个级别,并在找到右大括号时返回一个级别。然后它需要在每个级别的两个大括号之间存储字符串内容。

于 2010-10-14T13:15:21.107 回答
1

常规语言不起作用,因为常规语法无法匹配诸如“任意数量的左括号后跟任意数量的右括号”之类的内容。为此需要一个上下文无关的语法。

除非您使用Java 的上下文无关语法解析器或使正则表达式不再是正则表达式的正则表达式扩展,否则基于循环的解决方案可能是最奇特的解决方案。

于 2010-10-14T13:10:59.863 回答
1

如上所述,您将需要一个解析器。一种易于实现(而且写起来很有趣!)的类型是带有回溯的递归下降解析器。还有大量的解析器生成器,尽管其中大多数都有学习曲线。一种 Java 友好的解析器生成器是JavaCC

于 2010-10-14T13:44:32.937 回答