用于过滤JTable单列的正则表达式

时间:2014-05-14 08:18:26

标签: java regex

我有一个包含4列(名称,类别,持续时间,文件大小)和JTextField的JTable,我在其中输入短语以查找该JTable中的特定记录。

我需要一个正则表达式公式,以这种方式过滤记录:

的JTable:

名称|类别|持续时间|文件大小

Linkin.Park | cat1 | 00:03:30 | 5,30

如果我输入短语: kin - 它将显示所有有" kin"在名字里面。

如果我输入短语:lin * ar * - 它将显示所有以" lin"开头的歌曲,然后有任意数量的字符,然后输入" ar"然后是任意数量的角色。

如果我输入短语:lin?in * - 它将显示所有以" lin"开头的歌曲,然后有1个字符,然后在"中输入#34;然后是任意数量的角色。

另外,我需要过滤器只考虑JTable(名称)的第一列,例如,写作:30 *将显示以30开头的歌曲,但不会显示那些不以它开头的歌曲但是具有例如3:30的持续时间或例如7,30的文件大小。

对不起我的英文xD。

我现在有这种搜索:

    private void search(String text) {
            TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableUtwory.getModel());
            tableUtwory.setRowSorter(sorter);
            String regex;
            if(text.startsWith("*") && text.endsWith("*")) {
                    String s = Pattern.quote(text.replaceAll("^\\*|\\*$", ""));
                    regex = "(?i).+" + s + ".+";
            } else if(text.startsWith("*")) {
                    String s = Pattern.quote(text.replaceAll("^\\*", ""));
                    regex = "(?i).+" + s + "$";
            } else if(text.endsWith("*")) {
                    String s = Pattern.quote(text.replaceAll("\\*$", ""));
                    regex = "(?i)^" + s + ".+";
            } else {
                    String s = Pattern.quote(text);
                    regex = "(?i)^" + s + "$";
            }
    sorter.setRowFilter(RowFilter.regexFilter(regex));
    sorter.setSortKeys(null);
}

但如果我插入&#34; *&#34;它不会返回任何结果。在字符之间(例如lin * ar *),我没有选择使用&#34;?&#34;。此外,至于现在它还考虑其他列,而不仅仅是名称列,所以如果我输入&#34; 30 *&#34;它还返回大小或持续时间为30的歌曲。

1 个答案:

答案 0 :(得分:0)

问题的第二部分:

你必须只浏览dataValues的第一列(或任何你称之为的)二维数组,如:

for (int i=0; i<=dataValues.length; i++) {
  String s = dataValues[i][0];
}

无论如何,您能否提供有关JTable的更多信息,尤其是数据模型?

第一部分: 最简单的方法是将JTextField读入正则表达式,但是你必须确保它只包含*和/或?作为正则表达式字符然后尝试将其与上面的String s值匹配。你必须转变? to。{1}和* to。*

如果不是您为JTable设置数据值的那个,那么您可以直接从JTable中获取它们......

public static Object[][] getTableData(JTable table) {
DefaultTableModel dtm = (DefaultTableModel) table.getModel();
int nRow = dtm.getRowCount(), nCol = dtm.getColumnCount();
Object[][] tableData = new Object[nRow][nCol];
for (int i = 0 ; i < nRow ; i++)
    for (int j = 0 ; j < nCol ; j++)
        tableData[i][j] = dtm.getValueAt(i,j);
return tableData;
}

Object[][] dataValues = getTableData(YourJTable);

String regex;
if (s.indexOf("*") != -1) {
  regex = s.replaceAll("*", ".*");
}
if (regex.indexOf("?") != -1) {
  regex = regex.replaceAll("?", ".{1}");
}
for (int i=0; i<=dataValues.length; i++) {
      String s2 = (String) dataValues[i][0];
      if (s2.matches(regex)) {
         System.out.println("Match: " + s2);
      } else {
         System.out.println("Not match: " + s2); //for debugging
      }
}

}

请注意,如果有人在JTextField中为正则表达式编写任何特殊字符或组合,那么它会弄乱一切......所以你必须关注正确的输入。