在我的JMenuBar中,我试图添加另一个名为" Party"的JMenu。并在该菜单中有更多菜单,分配有项目。 我遇到的问题是我的ReGex并没有抓住所有正确的值,我不确定如何以正确的顺序添加它们。
我用于测试的文本文件如下(带行号):
我正确地加载了文件但是ReGex似乎并没有抓住它所应该做的所有事情。 预期的JMenu看起来像这样:
任何以" PC-"开头的东西作为JMenu党的JMenu 以及" C-"作为JMenu下的JMenuItem 这是我此部分的当前代码。
void loadParty(File f, Frame frame, JMenuBar mb, JMenu me) throws FileNotFoundException {
Scanner scan = new Scanner(new FileReader(f));
List<String> text = new ArrayList<String>();
JMenuItem item;
me.setText("Party");
JMenu subMen = new JMenu();
while(scan.hasNextLine()) {
text.add(scan.nextLine());
}
ArrayList<String> matchesCC = new ArrayList<String>();
ArrayList<String> charLinks = new ArrayList<String>();
String regexCC ="^(C- )+(\\w+)+( : )+(http:(.*))";
Pattern cc = Pattern.compile(regexCC, Pattern.MULTILINE);
for (String s:text) {
Matcher m = cc.matcher(s);
if (m.matches()) {
charLinks.add(m.group(4));
}
}
String regexTest = "^((\\w+\\W+)(\\w+))";
ArrayList<String> matchTest = new ArrayList<String>();
ArrayList<String> cT = new ArrayList<String>();
Pattern dmTest = Pattern.compile(regexTest, Pattern.MULTILINE);
for (String s:text) {
Matcher m = dmTest.matcher(s);
if (m.matches()) {
for (int i = 0; i <= m.groupCount(); i++) {
System.out.println(m.group(i));
}
matchTest.add(m.group(2));
cT.add(m.group(3));
}
}
for(int i = 0; i < cT.size(); i++) {
System.out.println(cT.get(i));
}
for(int i = 0; i < matchTest.size(); i++) {
if(matchTest.get(i) == "PC- ") {
subMen = new JMenu(cT.get(i));
if(matchTest.get(i) == "C- ") {
item = new JMenuItem(cT.get(i));
item.setMnemonic(KeyEvent.VK_0);
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
for(int l = 0; l <charLinks.size(); l++) {
if(e.getActionCommand() == matchesCC.get(l)) {
URL = charLinks.get(l);
loadLink(URL);
}
}
}
});
subMen.add(item);
}
}
me.add(subMen);
}
frame.revalidate();
frame.repaint();
}
出于某种原因,我的ReGex&#34; ^((\ w + \ W +)(\ w +))&#34;只是抓住:( PC-布兰登 PC-布兰登, PC-, 布兰登, PC-CJ, PC-CJ, PC-, CJ, PC-希望, PC-希望, PC-, 希望)并没有&#34; C-&#34;
任何帮助将不胜感激,如果您需要更多信息,请询问!
答案 0 :(得分:1)
首先,原谅我的迂腐,但&#34;正则表达式&#34;是&#34;正则表达式的缩写。&#34;资本化&#34; ReGex&#34;是荒谬的,因为没有一个单词以G开头。&#34; RegEx&#34;虽然在实践中没有应用资本化,但是可以接受;它只是&#34;正则表达式&#34;或&#34; regexp&#34;。
实际上,你需要的正则表达式功能远比你想象的要少得多。而不是尝试读取整个文件,然后解析生成的巨大文本块,您应该在阅读时处理每一行:
JMenu subMen = null;
while (scan.hasNextLine()) {
String itemType = scan.next();
String label = scan.next();
if (itemType.equals("PC-")) {
subMen = new JMenu(label);
me.add(subMen);
} else {
final String url = scan.findInLine("http\\S+");
JMenuItem item = new JMenuItem(label);
item.addActionListener(e -> loadLink(url));
subMen.add(item);
}
scan.nextLine();
}
上面的代码假定每个&#34; C - &#34; line能够匹配您的代码的第一个正则表达式。正如@camickr指出的那样,你在问题中显示的文字行不包含&#34; http&#34;在他们身上,所以这场比赛永远不会成功。请注意,显示与您正在处理的数据不相关的数据会使您的问题更难回答。
您不需要调用frame.revalidate()或frame.repaint()。除非您使用自定义容器和/或自定义布局,否则在将组件添加到容器时会自动处理这两者。