Я пытаюсь разбить предложение на слова, а затем распечатать их, если они содержат только альфа-символы. Вместо этого другие символы должны выводить сообщение об ошибке.

Пример ввода:

Быстрая коричневая лиса

Желаемый результат:

В

быстрый

коричневый

лиса

Пример ввода:

Th1 qu1ck br0wn fox

Желаемый результат:

Это неверно.

Я пытался сделать это по шаблону, но, думаю, не получилось.

import java.util.Scanner;
import java.util.regex.Pattern;
public class test {

    public static void main(String[] args) {

        System.out.println("This will break a sentence into words.");
        Scanner alpha = new Scanner(System.in);
        String beta = alpha.nextLine();
        String [] data = beta.split(" ");
        if (Pattern.matches("[a-zA-Z]+", beta)){
            System.out.println(data[0]);
            System.out.println(data[1]);
            System.out.println(data[2]);
            System.out.println(data[3]);
        }
        else {
            System.out.println("This is not valid.");
        }
    }

}
0
user3736846 20 Июн 2014 в 15:33
Не могли бы вы подробнее объяснить, что вы хотите, чтобы ваша программа делала? Также вы можете добавить вывод своей программы при ее запуске?
 – 
RemyG
20 Июн 2014 в 15:41
Вы разбиваете свое предложение на слова (кстати, используйте "\\s+" вместо " "), тогда все, что вам нужно сделать, это использовать свое выражение против каждого слова
 – 
user902383
20 Июн 2014 в 15:43
Вы разбиваете строку, но затем проверяете, состоит ли сама строка только из букв. Это будет недействительным, если у вас есть пробелы или знаки препинания. Кроме того, недействительно, если у вас есть неанглийские символы.
 – 
VLAZ
20 Июн 2014 в 15:45

5 ответов

Лучший ответ

Ответ прост :). Вы пытались сопоставить свой шаблон со всей inputString «beta», но вы уже разделили «beta», и вы хотите сопоставить шаблон не с beta, а с одним элементом вашего массива «data».

Измените это:

if (Pattern.matches("[a-zA-Z]+", beta)){}

К этому:

for(String word : data)
{
  Pattern.matches("[a-zA-Z]+", word)
}

Вы должны справиться с ситуацией, когда шаблон не совпадает, но это ваша работа. :) Я надеюсь, что это помогает.

2
VLAZ 20 Июн 2014 в 15:57
Вывод печатает «Быстрая коричневая лиса» четыре раза :(
 – 
user3736846
21 Июн 2014 в 05:24

Попробуйте следующий код:

    String str = "This is a brown fox";
    String patternStr= "[0-9]{1}";
    Pattern pattern = Pattern.compile(patternStr);
    Matcher matcher = pattern.matcher(str);
    if(matcher.find()){
      System.out.println("invalid");
    }else{
        System.out.println("valid");
    }

Спасибо JK

-1
HJK 20 Июн 2014 в 15:45
Итак, The qu!ck brown fox действителен?
 – 
VLAZ
20 Июн 2014 в 15:47
Почему {1}? Поскольку это регулярное выражение, почему бы просто не использовать шаблон "\d"?
 – 
Unihedron
20 Июн 2014 в 15:49

Еще один вариант с проверкой всей строки перед парсингом слов:

 private static boolean isValidSymbols(String s) {
    return  s != null && s.matches("[a-zA-Z\\s]+");
 }

 private static void checkInput(String s) {
     if (isValidSymbols(s)) {
         for (String word : s.split("\\s+")) {
             System.out.println(word);
         }
     } else {
         System.out.println("This is not valid.");
     }
 }

 public static void main(String[] args) {
     checkInput("The quick brown fox");
     checkInput("Th1 quick br0wn fox");
 }
0
udalmik 20 Июн 2014 в 15:50

Если я понимаю вопрос, самый простой способ - проверить буквы с кодом ASCII:

public class Test {

    public static void main(String[] args) {
        System.out.println("This will break a sentence into words.");
        Scanner alpha = new Scanner(System.in);
        String beta = alpha.nextLine();
        int count = 0;
        for (int i=0; i<beta.length(); i++) {
            if (((int)beta.charAt(i) > 64 && (int)beta.charAt(i) < 91) || ((int)beta.charAt(i) > 96 && (int)beta.charAt(i) < 123) || ((int)beta.charAt(i) == 32)) {
                count++;
            }
        }

        if (count == beta.length()) {
            System.out.println("correct");
        } else {
            System.out.println("incorrect");
        }
    }
}
0
BSeitkazin 20 Июн 2014 в 15:51
Как насчет неанглийских символов?
 – 
VLAZ
20 Июн 2014 в 15:53
@Vld, я думаю, что он использует только английские символы, потому что в своем регулярном выражении он использует: [a-zA-Z]
 – 
BSeitkazin
20 Июн 2014 в 15:56
Это зависит от того, было это задумано или нет. Обратите внимание, что ОП — новичок (без неуважения), поэтому он может просто не знать о влиянии.
 – 
VLAZ
20 Июн 2014 в 15:59

Попробуй это:

   System.out.println("This will break a sentence into words.");
        Scanner alpha = new Scanner(System.in);
        String beta = alpha.nextLine();
        String [] data = beta.split("\\s+");
        boolean valid = true;
        for (String word: data)
        if (!Pattern.matches("[a-zA-Z]+", word)){
               valid = false
                break;
         }
         if(valid)
        System.out.println("This is valid.");
            else
        System.out.println("This is not valid.");

Небольшие настройки, если ваше слово содержит больше стандартов tnat 26 букв

String beta = "Dieser Satz ist ungültig. This is valid";
String[] data = beta.split("[\\s+|\\.+]+");
boolean valid = true;

a: for (String word : data)
    for (char c : word.toCharArray())
        if (!Character.isAlphabetic(c)) {
            valid = false;
            break a;
        }

 if(valid)
       for (String word : data)
           System.out.println(word);
   else
        System.out.println("This is not valid.");
0
user902383 20 Июн 2014 в 15:59
This sentence is invalid. Also, this one из-за пунктуации и Dieser Satz ist ungültig (примечание: для последнего использовался Google переводчик).
 – 
VLAZ
20 Июн 2014 в 15:50
Вывод должен быть: быстрая коричневая лиса, но слова должны быть друг над другом (не знаю термина)
 – 
user3736846
20 Июн 2014 в 15:52