Создание операторов if / else и сканеров на основе ключевого слова в виде строки. - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь, чтобы мой код выполнял поиск по определенным ключевым словам, и на основе этих конкретных ключевых слов создаю запрос на ввод данных пользователем сканера для замены таких ключевых слов.Например, в текстовом файле:

Привет, меня зовут <имя>, Как вас зовут?Ваше имя <имя>?

Я люблю есть <еда>.А вы?

Программа должна обнаружить «<имя>» и предложить пользователю дважды ввести имя для разных ключевых слов.

Пока у меня есть это:

// Java program to illustrate reading from Text File
// Using scanner class
import java.io.File;
import java.util.Scanner;

public class TxtOutput{
public static void main(String[] args) throws Exception
      {
        // pass the path to the file as a parameter
        File file = new File("C:\\Users\\aaron\\Documents\\TestTXT\\test.txt");
        Scanner sc = new Scanner(file);
        //Types of keywords
        //<adjective>, <plural-noun>, <place>, <noun>, <funny-noise>, <person's-name>, <job>, <CITY>, , <Color!>
        //, <Exciting-adjective>, <Interersting-Adjective>, <aDvErB>, <NUMBER>, <Plural-noun>, <body-part>, <verb>, 
        //<Number>, <verB>, <job-title>, 
        String data1 = sc.nextLine();

        if (data1.contains("<job>"));
        Scanner user_input = new Scanner (System.in);
        String job1;
        System.out.println("Enter a profession");
        job1 = user_input.next(); 
        String replacedData1 = data1.replace("<job>", job1 ); 
        System.out.println(replacedData1);
      }


}

Программа может обнаружить только одно ключевое слово, и она имеет заранее сделанный оператор if и else.Есть ли способ сделать оператор if и else с помощью сканера на основе таких ключевых слов, как «<имя>» или «<еда>» в строке?Я не хочу бомбардировать эту программу ненужным количеством заранее сделанных операторов if и else.Мне было интересно, есть ли более эффективный способ сделать это.

1 Ответ

0 голосов
/ 09 июня 2018

Можно выполнить поиск по всему файлу данных по шаблонам ключевых слов <..>, используя регулярное выражение, добавить найденные ключевые слова в уникальный Set, а затем выполнить цикл по ключевым словам, чтобы запросить замены.Я думаю, вам понравится:

Я предлагаю явно указать шаблоны ключевых слов, используя чередования | в регулярном выражении, например:

<adjective>|<plural-noun>|<place>|<noun>|<funny-noise>|<person's-name>|<job>|<CITY>|<Color!>|<Exciting-adjective>|<Interersting-Adjective>|<aDvErB>|<NUMBER>|<Plural-noun>|<body-part>|<verb>|<Number>|<verB>|<job-title>

Демо

Мы могли бы использовать общее регулярное выражение, например <[^<>]+>, но я не знаю, что еще находится в вашем файле.Попробуйте.

Соберите все вместе, завершите пример :

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Ideone {
 public static void main(String[] args) throws java.lang.Exception {
  Set < String > uniqueKeywords = new HashSet < String > ();
  final String regex = "<adjective>|<plural-noun>|<place>|<noun>|<funny-noise>|<person's-name>|<job>|<CITY>|<Color!>|<Exciting-adjective>|<Interersting-Adjective>|<aDvErB>|<NUMBER>|<Plural-noun>|<body-part>|<verb>|<Number>|<verB>|<job-title>";
  final String filecontent = "Text template containing all sorts of .. <adjective>, <plural-noun>, <place>, <noun>, <funny-noise>, <person's-name>, <job>, <CITY>, , <Color!> <Exciting-adjective>, <Interersting-Adjective>, <aDvErB>, <NUMBER>, <Plural-noun>, <body-part>, <verb>,  <Number>, <verB>, <job-title>, String data1 = sc.nextLine(); blah blah";

  final Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
  final Matcher matcher = pattern.matcher(filecontent);

  while (matcher.find()) {
   uniqueKeywords.add(matcher.group(0));
  }

  Scanner user_input = new Scanner(System.in);
  for (String keyword: uniqueKeywords) {
   System.out.println("Enter a " + keyword);
   String replacement = user_input.next();
   String replacedData1 = filecontent.replace(keyword, replacement);
   System.out.println(replacedData1);
  }
 }
}
...