【问题标题】:How do I search for exact word in a String array which contain sentences(JAVA)如何在包含句子的字符串数组中搜索确切的单词(JAVA)
【发布时间】:2019-08-07 22:06:14
【问题描述】:

我有一个字符串数组,其中包含用户所需的 n 个元素。

假设有3个String元素:

Hey,
Hello there,
Hell no

我想搜索Hell这个词。

由于hello 中包含单词hell,因此程序应该只给出第三句而不是第二句。

另一个例子 - 元素是:

10
50
110

如果我搜索 10,输出应该是第一句而不是第三句(因为 110 包含 10)。

我已经为 String 创建了一个线性搜索数组,但我不知道如何在句子中的单词上实现它。

我们将不胜感激。谢谢。

【问题讨论】:

  • 发布您目前拥有的代码。

标签: java string search


【解决方案1】:

试试这个。关键是在 Java regexp 中使用单词边界(\b):

System.out.println(Arrays.stream("Hey, Hello there,Hell no".split(","))
        .filter(s -> s.matches(".*\\bHell\\b.*"))
        .collect(Collectors.joining(","))
);

【讨论】:

    【解决方案2】:

    equals 方法更适合您的要求:

    String strArray[] = { "Hey", "Hello there", "Hell no" };
    String inputStr = "Hell";
    
    for (int i = 0; i < strArray.length; i++) {
        String[] contents = strArray[i].split(" ");
        for (int j = 0; j < contents.length; j++) {
            if (inputStr.equals(contents[j])) {
                System.out.println(strArray[i]);
            }
        }
    }
    

    在这里,我们遍历初始数组,拆分每个单词,然后循环遍历结果数组以检查是否有匹配项。

    【讨论】:

      【解决方案3】:

      希望得到帮助:

      package demo;
      
      import java.util.Arrays;
      import java.util.List;
      import java.util.logging.Logger;
      import java.util.regex.Matcher;
      import java.util.regex.Pattern;
      import java.util.stream.Collectors;
      import java.util.stream.IntStream;
      import java.util.stream.Stream;
      
      
      enum SearchType {
          EXACTWORD,
          EXACT_NON_WORD,
          IN_THE_BEGINNING,
          IN_THE_END,
          INSIDE
      }
      public class Main {
          private final static Logger LOGGER =  
                  Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); 
          public static void main(String[] args) {
      
              // Demo with Strings
              String myText = "a,abc,abcd, abd def,abc, fgh,erf abc,Hey, Hello there, Hell no";
              String separator = ",";
              String toFind = "abc";
      
      
              System.out.println("\n------------------------------------------");
              System.out.println("SEARCHING TO: " + toFind);
              System.out.println("WITH : " + myText);
              System.out.println("------------------------------------------");
              for (SearchType searchType : SearchType.values()) { 
                  //LOGGER.log(Level.INFO, "Search Type: " + searchType);
                  String result = filterInputByRegex(myText, separator, toFind, searchType);
                  System.out.println("\tResults for " 
                          + searchType + " >\t" 
                          + (!result.isEmpty() ? result : "There is no match"));
                  System.out.println("matches indexes: " + Arrays.toString(searchIndexes(myText, separator, toFind, searchType)));
                  //LOGGER.log(Level.INFO, "matches indexes: " + Arrays.toString(searchIndexes(myText, separator, toFind, searchType)));
              }
      
              // Demo with integers
              myText = "  10  01   100   121 110 010 120 11";
              separator = " ";
              toFind = "10";
      
              System.out.println("\n------------------------------------------");
              System.out.println("SEARCHING TO: " + toFind);
              System.out.println("WITH : " + myText);
              System.out.println("------------------------------------------");
              for (SearchType searchType : SearchType.values()) { 
                  //LOGGER.log(Level.INFO, "Search Type: " + searchType);
                  String result = filterInputByRegex(myText, separator, toFind, searchType);
                  System.out.println("\tResults for " 
                          + searchType + " >\t" 
                          + (!result.isEmpty() ? result : "There is no match"));
                  System.out.println("matches indexes: " + Arrays.toString(searchIndexes(myText, separator, toFind, searchType)));
                  //LOGGER.log(Level.INFO, "matches indexes: " + Arrays.toString(searchIndexes(myText, separator, toFind, searchType)));
              }
          }
      
          /**
           * test regex
           * @param regex
           * @param text
           * @return
           */
          public static boolean matches(String regex, String text) {
              Pattern pattern = Pattern.compile(regex);
              Matcher matcher = pattern.matcher(text);
              return matcher.find();
          }
          /**
           *  Prepare Regex by enum searchType (exact word, non exact word, in the beginning, etc.)
           * @param search
           * @param searchType
           * @return
           */
          public static String prepareRegex(String search, SearchType searchType) {
              String text = "";
              switch(searchType) {
                  case EXACTWORD:
                      text = ".*\\b" + search + "\\b.*";
                      break;
                  case EXACT_NON_WORD:
                      text = ".*\\B" + search + "\\B.*";
                      break;
                  case IN_THE_BEGINNING:
                      text = "\\A" + search + ".*";
                      break;
                  case IN_THE_END:
                      text = ".*" + search + "\\z";
                      break;
                  case INSIDE:
                      text = ".*" + search + ".*";
                      break;
              }
              return text;
          }
          /**
           * Split String to List
           * @param input
           * @param separator "," for String or " " for integer list;
           * @return
           */
          public static List<String> splitToListString(String input, String separator){
              return (List<String>) Stream.of(input.split(separator))
                      .filter(str -> !str.isEmpty())
                      .map(elem -> new String(elem))
                      .collect(Collectors.toList());
          }
      
          /**
           * Join List to String (only for demo)
           * @param input
           * @param separator
           * @return
           */
          public static String joinStringListWithSeparator(List<String> input, String separator){
              return input.stream().collect(Collectors.joining(separator));
      
          }
      
          /**
           * Get Indexes of matching elements
           * @param input
           * @param separator
           * @param search
           * @param searchType
           * @return
           */
          public static int[] searchIndexes(String input, String separator, String search, SearchType searchType) {
      
              final String toFind = prepareRegex(search, searchType);
      
              List<String> sentences = splitToListString(input, separator);
      
              int[] indexesOfResults = IntStream
                  .range(0,  sentences.size())
                  .filter(index -> matches(toFind, sentences.get(index)))
                  .toArray();
      
              return indexesOfResults;
      
          }
      
          /**
           * Filter List (generated from String) by Regex
           * @param input
           * @param separator
           * @param search
           * @param searchType
           * @return
           */
          public static String filterInputByRegex(String input, String separator, String search, SearchType searchType) {
      
              final String toFind = prepareRegex(search, searchType);
      
              List<String> sentences = splitToListString(input, separator);
      
              List<String> results = sentences
                  .stream()
                  .parallel()
                  .filter(elem -> matches(toFind, elem))
                  .collect(Collectors.toList());
      
              return joinStringListWithSeparator(results, separator);
      
          }
      }
      
      

      这个演示将返回“abc”和“10”这个:

      
      ------------------------------------------
      SEARCHING TO: abc
      WITH : a,abc,abcd, abd def,abc, fgh,erf abc,Hey, Hello there, Hell no
      ------------------------------------------
          Results for EXACTWORD > abc,abc,erf abc
      matches indexes: [1, 4, 6]
          Results for EXACT_NON_WORD >    There is no match
      matches indexes: []
          Results for IN_THE_BEGINNING >  abc,abcd,abc
      matches indexes: [1, 2, 4]
          Results for IN_THE_END >    abc,abc,erf abc
      matches indexes: [1, 4, 6]
          Results for INSIDE >    abc,abcd,abc,erf abc
      matches indexes: [1, 2, 4, 6]
      
      ------------------------------------------
      SEARCHING TO: 10
      WITH :   10  01   100   121 110 010 120 11
      ------------------------------------------
          Results for EXACTWORD > 10
      matches indexes: [0]
          Results for EXACT_NON_WORD >    There is no match
      matches indexes: []
          Results for IN_THE_BEGINNING >  10 100
      matches indexes: [0, 2]
          Results for IN_THE_END >    10 110 010
      matches indexes: [0, 4, 5]
          Results for INSIDE >    10 100 110 010
      matches indexes: [0, 2, 4, 5]
      
      

      【讨论】:

        猜你喜欢
        • 2018-01-08
        • 2013-06-22
        • 1970-01-01
        • 1970-01-01
        • 2020-05-26
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 2021-09-27
        相关资源
        最近更新 更多