Java 过滤JTable'的正则表达式;s单列

Java 过滤JTable'的正则表达式;s单列,java,regex,Java,Regex,我有一个包含4列(名称、类别、持续时间、文件大小)的JTable和JTextField,我在其中输入短语以查找该JTable中的特定记录 我需要一个正则表达式,它可以这样过滤记录: JTable: 名称|类别|持续时间|文件大小 林肯公园| cat1 | 00:03:30 | 5,30 如果我输入短语:kin-它将显示所有名字中包含“kin”的歌曲 如果我输入短语:lin*ar*-它将显示所有以“lin”开头的歌曲,然后是任意数量的字符,然后是“ar”,然后是任意数量的字符 如果我输入短语:li

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

我需要一个正则表达式,它可以这样过滤记录:

JTable:

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

林肯公园| cat1 | 00:03:30 | 5,30

如果我输入短语:kin-它将显示所有名字中包含“kin”的歌曲

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

如果我输入短语:lin?in*-它将显示所有以“lin”开头的歌曲,然后是1个字符,然后是“in”,然后是任意数量的字符

此外,我需要这个过滤器只考虑JTALE(名称)的第一列,例如,写: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);
}
private void搜索(字符串文本){
TableRowSorter-sorter=新的TableRowSorter(tableUtwory.getModel());
表1.设置行分拣机(分拣机);
字符串正则表达式;
if(text.startsWith(“*”)&&text.endsWith(“*”)){
字符串s=Pattern.quote(text.replaceAll(“^\\*\\\*$”,”);
regex=“(?i)。+”+s+”;
}else if(text.startsWith(“*”){
字符串s=Pattern.quote(text.replaceAll(“^\\*”,”);
regex=“(?i)。+”+s+“$”;
}else if(text.endsWith(“*”)){
字符串s=Pattern.quote(text.replaceAll(“\\*$”,“”));
regex=“(?i)^”+s+”;
}否则{
字符串s=模式。引号(文本);
regex=“(?i)^”+s+“$”;
}
sorter.setRowFilter(RowFilter.regexFilter(regex));
分拣机设置密钥(空);
}

但是如果我在字符之间插入“*”(例如lin*ar*),它不会返回任何结果,并且我没有使用“?”的选项。此外,现在它还考虑其他列,而不仅仅是名称列,因此如果我输入“30*”,它还会返回大小或持续时间为30的歌曲。

问题的第二部分:

您只需遍历dataValues(或您所称的)二维数组的第一列,如:

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

for(int i=0;i意思是你想要通配符匹配。有关一些想法,请参阅此问题。我应该补充一点,如果你想要更具体的帮助,你应该更具体地说明你的问题。A会很好。我没有看到你尝试过完成此任务。这不是一个说“我想要这个和那个,还有那个”的网站…我们必须看到你的努力。。。
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
      }
}