我试图用Java中的数据结构来表示正则表达式。
我创建了一个这样的类来表示单个字符:
class RegexElement {
String elem;
int min;
int max;
boolean isOptional;
}
通过这种方式,我可以表示例如这样的正则表达式:\w{4,5}
。首先我想创建一个RegexElement列表,但问题在于RegexElement块的迭代器(这样我只能表示单个字符,而不是像(\w\s)+
这样的块。)
所以我想创建一个名为Element
的抽象类,以及两个子类:一个RegexElement
和另一个IteratorBlockElement
。第一个表示像之前一样的单个字符,第二个表示一个字符块迭代。通过这种方式,IteratorBlockElement
的实例变量是一个元素列表,因为可能发生两个嵌套迭代器,如:(\w(\d\w)+)+
。
如果我使用所描述的域管理此正则表达式,我将有一个元素列表,其中包含一个IteratorBlockElement
对象,由RegexElement
和另一个IteratorBlockElement
组成,由两个RegexElement
组成。
我不确定这是否正确,创建一个具有实例变量的超类的子类,因此它可以拥有自己的实例。可能有一个更智能的解决方案,这种特殊情况的模式。谢谢!
答案 0 :(得分:2)
完全可以并且拥有包含元素的元素的自然方式。例如,这样做表示像3 + 4*5
。
class BinaryExpr extends Expr {
Expr left;
BinaryOp op;
Expr right;
}
要查看完整的Java正则表达式需要多少数据类型,请阅读java.util.Pattern
的源代码。