【发布时间】:2016-01-23 05:05:18
【问题描述】:
我有这张桌子
我正在使用以下代码从我的表中检索数据 返回其库尔德语单词包含的所有英语单词 بةرز
targetText="بةرز";
try (PreparedStatement ps = conn.prepareStatement(
"SELECT English,Kurdish FROM Info " +
"WHERE Kurdish = ? " +
"OR REGEXP_MATCHES(Kurdish, ?) " +
"OR REGEXP_MATCHES(Kurdish, ?) " +
"OR REGEXP_MATCHES(Kurdish, ?) ")) {
ps.setString(1, targetText);
ps.setString(2, "^[. ]*" + targetText+ "[ ]*[:،,]+[ .]*$");
ps.setString(3, "^[. ]*[:،,]+[ ]*" + targetText+ "[. ]*$");
ps.setString(4, "^[. ]*[:،,]+[ ]*" + targetText+ "[ ]*[:،,]+[ .]*$");
try (ResultSet rSet = ps.executeQuery()) {
while (rSet.next()) {
System.out.println(rSet.getString("English"));
System.out.println(rSet.getString("Kurdish"));
}
}
}
所以它工作正常,它打印出我想要的所有英文单词。
我的问题是,当我得到相应的库尔德语单词时,它不会打印完整的单元格。它只打印 بةرز,
例如前面代码的输出应该是:
aesthete
بةرز ، جوانىثةرست
aether
زوَر ناسك ، بةرز ، ثيروَز ، ئاسمانى
affair
بةرز
但它会打印出来
aesthete
بةرز
aether
بةرز
affair
بةرز
我该怎么做才能得到我想要的输出?
请注意,我使用UCanAccess 进行数据库连接,
【问题讨论】:
-
我无法使用 UCanAccess 3.0.2 重新创建您的问题。我将您的示例数据复制并粘贴到 Access 表中,并将您的代码复制并粘贴到 Eclipse 项目中。当我运行它时,唯一匹配的行是“事务”。
-
你的正则表达式应该做什么?
[. ]*[:،,]+[ ]*对您意味着什么?对我来说,这意味着:、،或,字符的序列,可选地前面有空格或句点和/或后面有空格。加上锚^,表示不允许有其他文字,所以肯定不会匹配前2个红圈之前的内容。 --- 另外,由于显示的数据Affair以大写字母开头,而您的输出以小写字母开头,因此您 not 正在读取 that 数据。 -
由于这与正则表达式无关(当然可以改进),我建议您完全删除 where 子句并在没有它的情况下测试查询。然后看看你得到了什么输出。
-
我还怀疑库尔德语从右到左 (RTL) 的阅读顺序可能与匹配问题有关。
ps.setString(2, "^ز.*");匹配“aether”,所以^锚实际上尊重 RTL 排序,至少对我而言。 -
您的其他问题与
PreparedStatement与Statement无关,您只是使用了UCanAccess 无法理解的SQL 语法。
标签: java regex prepared-statement ucanaccess