我正在尝试创建一个简单的正则表达式的东西供我自己使用,其中字符串中的字符可以是完全匹配,也可以是属于组的一组字符中的一个(例如,组CAPS将具有所有大写字符 - 'A','B'等)。因此,诸如 - CAPS p p l e
- 的正则表达式应匹配“Apple”或正则表达式(例如 - DIGIT DIGIT . DIGIT
- 应匹配76.3。
我正在尝试将此正则表达式模式存储在数组{CAPS, 'p', 'p', 'l', 'e'}
中。
现在,Java将允许我声明一个类型为char[]/Character[]
或Group[]
的数组,其中Group是我构造的类,表示这样的字符组。如果我需要一个混合数组来存储上面提到的模式,除了声明类型为Object[]
的数组之外还有哪些其他选项?
我真的不想处理Object[]
类型的数组。
答案 0 :(得分:3)
您可以定义一个公共超类(接口),其中包含普通字符和字符类/组的子类。
答案 1 :(得分:1)
如果您需要混合数组或集合,则需要在公共接口或超类型后面抽象char / Character和Group。鉴于char是一个原语,而Character是一个最终类,编写一个接口并包装char / Character将是你最好的选择。
我建议将Group设为一个接口(可能重命名),然后创建两个实现Group的类 - 一个包装char或Character(让我们称之为SingleChar)和一个具体的Group(让我们称之为GroupImpl,现在),这是为了原始组的目的。创建一个Group []数组,并通过您的公共接口操作Group的每个实例。
答案 2 :(得分:0)
您无法使用两种不相关类型之一的元素定义数组。
您可以定义自己的超类型(或接口),从中扩展两个类,一个包装一个字符,另一个包含您的组。
或者,或许更简单,只需使用一个Object []并将其包含在具有智能的类中以放置/获取正确的类型。
答案 3 :(得分:0)
char []是无类型的,也许不是与之互动的最佳选择。
Group []并没有真正描述它的作用。
也许您可以使用方法“匹配”的接口,并在那里粘贴一堆实现此接口的对象。
因此,其中一个对象可能被实例化为“new MatchChar('a')”而另一个可能是“new MatchType(MatchType.CAPS)”。
问题在于它实例化并不是很容易 - 它很冗长。我会使用一种方法(在“匹配”里面说,它可能是MatchType和MatchChar的超类),就像getMatches一样,它将获取一个字符串并返回完全生成的数组。
我喜欢你的“语言”通常比正则表达式更明确,所以这样的事情:“[DIGIT] [DIGIT]。[DIGIT]”或“[CAPS] pple” - 加上强制性的“[ []“和”[]]“匹配大括号。
然后你的方法只是在字符串中查找匹配[],创建正确的MatchGroup对象,将剩余的字母转换为MatchChar对象并将它们返回给调用者。
解析像这样的字符串非常简单,事实上StringTokenizer会有一个球。
答案 4 :(得分:0)
您可以使用Composite设计模式来模拟这种情况。当您需要以相同的方式处理对象类型以及该类型的对象的集合时,此模式非常有用。您也可以使用Chain of Responsibility模式。
基本上你会定义这样的类(假设你需要一个matches()方法):
class Pattern {
IPatternComponent[] pattern;
boolean matches(String str) {
for(int i = 0; i < str.length; i++) {
if(!pattern[i].matches(str.charAt(i)))
return false;
}
return true;
}
}
interface IPatternComponent {
boolean matches(char ch);
}
class Simple implements IPatternComponent {
char ch;
boolean matches(char ch) {
return (this.ch == ch);
}
}
class Group implements IPatternComponent {
Set<IPatternComponent> components;
boolean matches(char charToMatch) {
for(IPatternComponent comp : components) {
if(comp.matches(charToMatch)
return true;
}
return false;
}
}
采用DIGIT DIGIT . DIGIT
示例:
Pattern
class。DIGIT
,DIGIT
,.
,DIGIT
}。.
将是Simple
。DIGIT
将是一个实例
Group
,将存储
1
,2
,3
,4
,5
,6
,7
,8
,{{ 1}},9
在其内部0
set
。Simple
将使用链
责任 - 委托
责任在链条上。使用此设计,您还可以轻松地将matches()
定义为ALPHANUM
,其内部集由Group
和ALPHABETS
组成,DIGIT
仍可使用。
注意:我直接在此编码代码,因此可能存在拼写错误或小错误。为了更好的可读性,我省略了构造函数。