将字符串匹配到Java中的列表

时间:2014-01-22 00:18:34

标签: java regex string list matcher

所以我有这个项目,我必须匹配字符串(这很长,所以我用一个util将多个字符串组合成一个字符串)到密码(看看有多少匹配),但我有10,000个密码,我需要检查,所以我无法使用正确的正则表达式一次一个地手动输入它们。有没有办法可以将它们格式化为列表,也许用逗号?这是我目前的代码,手动输入前几个“密码”。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;


public class RegexTestPatternMatcher {
public static final String test = org.apache.commons.lang3.StringUtils.join(new String[] {
"multiple",
"strings",
"here"
} );

public static final String bib = org.apache.commons.lang3.StringUtils.join(new String[] {

"different",
"strings",
"here"
} );

public static final String dict = org.apache.commons.lang3.StringUtils.join(new String[] {
"even more",
"strings",
"here"
} );

 List<String> testlist = Arrays.asList(dict.split("\\s*.,\\s*."));
public static void main(String[] args) {
Pattern pattern = Pattern.compile("\\S+", Pattern.CASE_INSENSITIVE);
// in case you would like to ignore case sensitivity,
// you could use this statement:
// Pattern pattern = Pattern.compile("\\s+", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(test);
// check all occurance
while (matcher.find()) 
{
  System.out.print("Start index: " + matcher.start());
  System.out.print(" End index: " + matcher.end() + " ");
  System.out.println(matcher.group());
}

// now create a new pattern and matcher to replace whitespace with tabs
Pattern replace = Pattern.compile("\\s+");
Matcher matcher2 = replace.matcher(test);
System.out.println(matcher2.replaceAll("\t"));
double scarlet = 0;
double bible = 0;
double dictionary = 0;

if(test.matches(".*?//bpassword//b.*?"))
{
scarlet += 1;
System.out.println("hello?");
}
    if(test.matches(".*?\\b123456\\b.*?"))
{
scarlet += 1;
}
    if(test.matches(".*?\\b12345678\\b.*?"))
{
scarlet += 1;
}
    if(test.matches(".*?\\b1234\\b.*?"))
{
scarlet += 1;
}
    if(test.matches(".*?\\bqwerty\\b.*?"))
{
scarlet += 1;
}
    if(test.matches(".*?\\b12345\\b.*?"))
{
scarlet += 1;
}
    if(test.matches(".*?\\bdragon\\b.*?"))
{
scarlet += 1;
}
    if(test.matches(".*?\\bpussy\\b.*?"))
{
scarlet += 1;
}
System.out.println("Scarlet Letter Matches: " + scarlet);

//等等......

但我有很多单词/字符串我希望与原始测试相匹配(确切地说是10,000)并且我将它们放在word文档中并且可以很容易地使用逗号格式化它们,但是将它们放在格式化之间上面实际需要一个星期。有没有办法将原始字符串与列表匹配?

修改 我已经得到它所以它读取代码,但它总是出现它运行的次数(如果我放入10则为11,如果我放入100则为101,等等)。

int scarlet = 0;
int bible = 0;
int dictionary = 0;
int x = 0;

List<String> passwords = Arrays.asList(password.split(".*\\s,\\s.*"));

 for(x = 0; x <= 10; x++)
 {
if(test.matches(".*?\\b" + passwords + "\\b.*?"))
{
scarlet++;
}
  }

上面结尾的Scarlet = 11,如果我这样做(x = 0; x <= 10000; x ++),那么它就是10,001。

3 个答案:

答案 0 :(得分:0)

尝试将10000个密码加载到数据库中,然后使用sql测试是否存在。 你正在这样做的方式(如你所说)将永远采取,并且非常容易出错。此外,如果您需要维护列表,则需要进行代码更改,重新编译,重新部署。

答案 1 :(得分:0)

如果您将所有密码读入List,由于每个匹配执行相同的代码,为什么不像这样循环它们

List<String> passwords = new ArrayList<String>();
// read in your passwords... from a file?
for(String s : passwords)
{
     if(test.matches(".*?\\b" + s + "\\b.*?"))
     {
          scarlet += 1;
     }

}

答案 2 :(得分:0)

我知道这可能听起来太简单了,但只是检查......假设你有两个字符串列表,你想检查一个列表中的任何字符串是否与另一个列表中的字符串匹配,你是否尝试过蛮力搜索!

//List<String> testwords = your list of test words
//List<String> passwords = your list of passwords

    for(String test: testwords) {
        for(String password: passwords) {
            if(test!=null && test.equals(password)) {
                scarlet++;
            }
        }
    }