Java Regex:如何在大文本中搜索文本或短语

时间:2015-10-07 14:01:18

标签: java regex

我有一个大文本文件,我需要逐行搜索文件中的单词或短语,然后输出包含在其中找到的文本的行。

例如,示例文本为

And the earth was without form, Where [art] thou?

如果用户搜索thou字,则唯一要显示的行是

Where [art] thou?

如果用户搜索the earth,则应显示第一行。

我尝试使用contains功能,但在仅搜索without时也会显示thou

这是我的示例代码:

String[] verseList = TextIO.readFile("pentateuch.txt");
    Scanner kbd = new Scanner(System.in);
    int counter = 0;

    for (int i = 0;  i < verseList.length; i++) {
        String[] data = verseList[i].split("\t");
        String[] info3 = data[3].split(" ");
        System.out.print("Search for: ");
            String txtSearch = kbd.nextLine();
            LinkedList<String> searchedList = new LinkedList<String>();
            for (String bible : verseList){
                if (bible.contains(txtSearch)){
                    searchedList.add(bible);
                    counter++;
                }
            }
            if (searchedList.size() > 0){
             for (String s : searchedList){
                    String[] searchedData = s.split("\t");
                    System.out.printf("%s - %s - %s - %s \n",searchedData[0], searchedData[1], searchedData[2], searchedData[3]);
                }
            }
            System.out.print("Total: " + counter);

所以我在考虑使用regex,但我不知道如何使用<<。 有人可以帮忙吗?谢谢。

2 个答案:

答案 0 :(得分:1)

要匹配包含单词的字符串,请使用以下代码:

String txtSearch; // eg "thou"

if (str.matches(".*?\\b" + txtSearch + "\\b.*"))
   // it matches

此代码构建一个正则表达式,仅当txtSearch的两端都落后,并且使用\b时字符串中单词的开头/结尾才会匹配,这意味着&#34;字边界&#34 ;

答案 1 :(得分:1)

由于有时变量在边界位置具有非单词字符,因此您不能依赖\b字边界。

在这种情况下,使用环顾(?<!\w)(?!\w)更安全,例如在Java中,类似于:

"(?<!\\w)" + searchedData[n] + "(?!\\w)"