在文本中找到一个单词

时间:2014-02-26 22:53:20

标签: java pattern-matching match java.util.scanner

以下代码似乎工作正常

String key = "jumps"   
String text = "the quick brown fox jumps over the lazy dog";  
if (text.matches(".*\\b"+key+"\\b.*"))
    System.out.println("Match");

if语句为TRUE,我将MATCH打印出来。 但这就是我需要做的事情:
创建一个名为text.txt的文件,然后输入“快速的棕色狐狸跳过懒狗”。

String text = new Scanner( new File("test.txt") ).useDelimiter("\\A").next();
String key = "jumps" 
if (text.matches(".*\\b"+key+"\\b.*"))
    System.out.println("Match");

如果test.txt文件中只有一行,则此匹配似乎无效 如果文件中有一行 - if语句为TRUE 如果我用两行创建文件 -
快速的棕色狐狸跳过懒狗 快速的棕色狐狸跳过懒狗

那么if语句似乎永远不会是真的 关于为什么以及我能做些什么才能使这个匹配与文件一起工作的任何想法?

3 个答案:

答案 0 :(得分:1)

.与换行符不匹配,因此当您有新行时,它会失败。使用\s匹配换行符。

我不是正则表达式专家,但(.|\s)一种方式,使用|(符号表示OR)将两者结合起来。组合应匹配任何字符,包括换行符。因此,您的表达式变为

"(.|\\s)*\\b" + key + "\\b(.|\\s)*"

答案 1 :(得分:0)

为什么不使用indexOf

例如:

String text = new Scanner( new File("test.txt") ).useDelimiter("\\A").next();
String key = "jumps";
if (Arrays.asList(text.split("[\\s]")).indexOf(key) != -1)
    System.out.println("Match");
else
    System.out.println("No match");

这个解决方案的好处在于它还能为您提供序列中的哪个单词;但是,对于非常大的字符串来说,它可能不会很快。

如果您确实想要使用正则表达式,则需要使用\s,因为新行可以由\n\r\r\n {{表示3}}。所以,你需要这样的东西:

编辑:改为使用以下正则表达式:"(?s:.*\\b"+key+"\\b.*)"

if (text.matches("(.|\\s)*\\b"+key+"\\b(.|\\s)*"))
    System.out.println("Regex: Match");
else
    System.out.println("Regex: No match");

如果您要在非常大的文件中查找单词,可能需要查看and \s can be any of these。只需下载jar,将其添加到classpath,并确保import com.eaio.stringsearch.*;

BNDMWildcards bndm = new BNDMWildcards();
int bndmIdx = 0;
int stopIdx = text.length();
boolean isFound = false;

while(!isFound && (bndmIdx = bndm.searchString(text, bndmIdx, stopIdx, "."+key+".")) != -1){
    char[] textChars = text.toCharArray();
    if(Character.isWhitespace(textChars[bndmIdx]) && Character.isWhitespace(textChars[bndmIdx+key.length()+1])){
        System.out.println("BNDM: Match");
        isFound = true;
    }
}
if(!isFound)
    System.out.println("BNDM: No match");

我不确定这种方法与其他两种方法的比较速度。我的猜测是短text需要更长时间,但text很长时会更快。

编辑:之前的regex包含了导致StackOverflowException的可能性(对于这个网站来说很完美!) - 我应该看到的一个问题。这是因为它在尝试搜索text时创建了大量的子表达式。

您可以尝试的替代正则表达式是"(?s:.*\\b"+key+"\\b.*)"。这启用了StringSearch,迫使.匹配所有字符。它应该只创建一个子表达式。

答案 2 :(得分:0)

为什么不尝试这种方法?

Scanner scanner = new Scanner(new File("test.txt"));
    String text = "" ;
    while(scanner.hasNext())
    {
        text=text+scanner.nextLine();
    }
 if (text.matches(".*\\b"+key+"\\b.*"))
System.out.println("Match");