我有一个包含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的歌曲。
答案 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中为正则表达式编写任何特殊字符或组合,那么它会弄乱一切......所以你必须关注正确的输入。