如何检查字符串上的某些单词?

问题描述:

if (c.getQuery().contains("update") || c.getQuery().contains("delete") || c.getQuery().contains("truncate") 
      || c.getQuery().contains("drop")) { 
     throw new MensagemException(Mensagens.getMensagem("Only select is allowed")); 

我有这个简单的代码,检查字符串查询。但它只能检查小写字母,我能做些什么来确认任何大写字母而不用一遍又一遍地写出这些字符?如何检查字符串上的某些单词?

+1

使用'compareToIgnoreCase' – Dimitri

+0

@Dimitri那就没办法了因为OP的意图不是要比较整个字符串 –

+0

此问题重复 https://stackoverflow.com/questions/17134773/to-check-if-string-contains-particular-word 和https:// stackoverflow。 com/questions/86780/how-to-check-if-a-string-contains-another-string-in-a-case-insensitive-manner -in – 2017-10-06 13:41:43

不幸的是,Java字符串没有containsIgnoreCase方法。解决此问题的方式是将输入转换为小写字母(或大写,你挑),并检查是否有小写的话你要搜索:

String toSearch = c.getQuery().toLowerCase(); 
if (toSearch.contains("update") || 
    toSearch.contains("delete") || 
    toSearch.contains("truncate") || 
    toSearch.contains("drop")) { 
     throw new MensagemException 
      (Mensagens.getMensagem("Only select is allowed")); 
} 
+0

我相信这个答案是错的。这个问题肯定是一个XY问题的例子;您不检查SQL查询是否通过在其他SQL关键字上使用“包含”来进行选择。只要表中的任何字段包含其中一个字符串(例如,从mytable中选择updated_on),此答案就会中断。最好你可以使用startsWith并假定只有一个查询正在执行,但试图解决“我如何检测非选择SQL查询”肯定是真正的问题,而不是他们提出的问题。 – adamcooney

我会做一些改进:

final String cQuery = c.getQuery(); // retrieve only once 
// check null, convert query to lower case so case won't matter anymore 
final String cQueryLower = cQuery == null ? null : cQuery.toLowerCase(); 
if (cQueryLower.contains("update") || cQueryLower.contains("delete") || cQueryLower.contains("truncate") || cQueryLower.contains("drop")) { 
    throw new MensagemException(Mensagens.getMensagem("Only select is allowed")); 
} 

你可以试试这个太:if (!cQueryLower.contains("select"))

你可以使用toLowerCase()这样你就可以检查大写和小写的所有变种小写

if (c.getQuery().toLowerCase().contains("update") || c.getQuery().toLowerCase().contains("delete") || c.getQuery().toLowerCase().contains("truncate") 
      || c.getQuery().toLowerCase().contains("drop")) { 
     throw new MensagemException(Mensagens.getMensagem("Only select is allowed")); 

我的意思是它必须像这样工作。我没有测试它

您可以将您的字符串为小写,然后让你在做同样的事情,应该是这样的:

String queryToLowerCase = c.getQuery().toLowerCase(); 
if (queryToLowerCase .contains("update") || queryToLowerCase .contains("delete") 
     || queryToLowerCase .contains("truncate") || queryToLowerCase .contains("drop")) { 
    throw new MensagemException(Mensagens.getMensagem("Only select is allowed"));