主要想法:我有一个URL(字符串),我也有一个数据很少的数组(字符串)。我想使用contains()
方法检查是否在URL中找到了数组中的字符串。
我的代码结构:首先,字符串单词存储在文本文件中。我将读取该文件并将值存储在JTextArea
中。从JTextArea
我使用getText()
方法并将值存储在Array中。现在,我将使用contains
方法检查字符串。这是我的代码:
此函数(正常工作)读取文本文件并在JTextArea
内写入。
JTextArea jta = new JTextArea(300,300);
Reader reader = null;
try {
reader = new FileReader(new File("res/pass.txt"));
jta.read(reader, "The force is strong with this one");
} catch (Exception exp) {
exp.printStackTrace();
} finally {
try {
reader.close();
} catch (Exception exp) {}
}
在此之前等待,这些是先前存储在pass.txt
内的单词。举个例子:
红〜
绿〜
黄色〜
黑色〜
这个函数(工作正常)知道数组的长度。
String getArr="";
int getCount=0, z=0, lens = jta.getText().length();
for(int i=0; i<lens; i++){
if(jta.getText().charAt(i)=='~'){
getCount++;
}
}
此函数(正常工作)将字符串存储在Array中。
String[] arr = new String[getCount];
for(int i=0; i<lens; i++){
if(jta.getText().charAt(i)!='~'){
getArr = getArr+jta.getText().charAt(i);
}
else{
arr[z] = getArr; getArr=""; z++;
}
}
问题从这里开始。我试图在控制台中打印所有数组值,并显示所有值。但是,当我进行比较时,它没有像我预期的那样工作。
String txtGetURL = txtURL.getText(); //The URL
Boolean ok=true;
for(int i=0; i<arr.length; i++){
System.out.print(arr[i]);
}
for(int i=0; i<arr.length; i++){
if(txtGetURL.toLowerCase().contains(arr[i].toLowerCase())){
ok=false;
}
}
if(ok==false){
JOptionPane.showMessageDialog(null, "URL Blocked!");
}
else{
JOptionPane.showMessageDialog(null, "Whitelist URL");
}
假设我在文本字段中输入的示例网址为http://www.example.com/ex/examplered.html
,而不是显示URL Blocked
它显示Whitelist URL
。请帮我解决我的问题。提前谢谢。
答案 0 :(得分:1)
你可以使用它,
org.apache.commons.lang3.StringUtils.containsIgnoreCase(txtGetURL , arr[i].trim());
通过使用此功能,您可以忽略大小写并检查它是否包含,以及
如果您确定该字符串只包含字母,则可以通过
清除它String resultString = arr[i].replaceAll("[^\\p{L}\\p{Nd}]+", "");
答案 1 :(得分:0)
我想问题是你的数组中的字符串包含行分隔符(\n
)
在这种情况下,因为url不包含它,contains
方法返回false。
要解决这个问题,请更改代码(我还建议使用String.split()
,这样会更简单):
String[] arr = jta.getText().split("~");
当您检查时,请使用trim()
来避免行分隔符:
if (txtGetURL.toLowerCase().contains(arr[i].trim().toLowerCase())) {
ok = false;
}
答案 2 :(得分:0)
在处理String
对象时,不需要根据字符和索引手工构建自己的解析,有很多方法可以帮助。
此处,您可能希望使用split()
和trim()
。
最初,您的值为red~
,然后将它们放入文本区域,这可能会为其添加一些空白区域。因此,您最终处理的价值可能是:red ~ \n
或某些变体。
因此,首先在split()
字符上使用~
,然后在生成的拆分数组的第一个元素上使用trim()
。
我在这里写了一个快速测试课程来展示这个:
public class BlockedWords {
public static void main(final String[] args) {
//Various different types of white space within the input.
final String[] input = {" A ~\n\r","\n\rB ~","\nE\r~"," G\n~"};
final String[] urls = {"www.url.com/A","www.url.com/B","www.url.com/C","www.url.com/D",
"www.url.com/E","www.url.com/F","www.url.com/G","www.url.com/H"};
final BlockedWords whiteListing = new BlockedWords(input);
for (final String url : urls) {
if( whiteListing.containsBlockedWord(url) ) {
System.out.println(url + " is blocked.");
continue;
}
System.out.println(url + " is whitelisted.");
}
}
private String[] blockedWords;
public BlockedWords(final String[] blockedWords) {
for (int i = 0; i < blockedWords.length; i++) {
//Split on the ~ character to get an array of {"word", ""} then just take the word. in index 0.
//Then trim it in case there are any whitespace characters still around the word.
blockedWords[i] = blockedWords[i].split("~")[0].trim();
}
this.blockedWords = blockedWords;
}
public boolean containsBlockedWord(final String url) {
for (final String blockedWord : this.blockedWords) {
if( url.toLowerCase().contains( blockedWord.toLowerCase() ) ) {
return true;
}
}
return false;
}
}
输出是这样的:
www.url.com/A被封锁。
www.url.com/B被封锁。
www.url.com/C已列入白名单。
www.url.com/D已列入白名单。
www.url.com/E被封锁。
www.url.com/F已列入白名单。
www.url.com/G被封锁。
www.url.com/H已列入白名单。