Поиск регулярных выражений () в Java

#java

#java

Вопрос:

Я пытаюсь написать программу MultiplicationTable, которая отображает таблицу умножения, вводимую пользователем из командной строки, так что, если пользователь вводит таблицу умножения 5 7 9, появляются таблицы 5,7 и 9. Он также должен обслуживать входные данные, такие как таблица умножения 7-11, которая будет отображать таблицы с 7 по 11. Вот что я написал:

 import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MultiplicationTable{

    static void multTable(int n){
        for(int i=0; i<=12; i  ){
            System.out.printf("%2s", i);
            System.out.println(" * "   n   " = "   i*n);
        }
    }   

    static String REGEX = "-";

    public static void main (String[] args){

        Pattern p = Pattern.compile(REGEX);

        if(args.length == 0)
            System.out.println("Error! No multiplication table entered!");
        else{
            for(int i=0; i<args.length; i  ){
                Matcher m = p.matcher(args[i]); 
                if(m.lookingAt()){  // If a dash is found
                    int start = Integer.parseInt(args[i].substring(0, m.start()-1));
                    int end = Integer.parseInt(args[i].substring(m.start() 1, args[i].length()-1));
                    System.out.println(start   ","   end);
                    /*for(int j=start; j<=end; j  )
                        multTable(j);
                }
                else{
                    multTable(args[i].Integer.parseInt(substr(0, args[i].length-1)));*/
                }
            }
        }
    }
}
 

Проблема в том, что программа не входит в этот оператор if:

 if(m.lookingAt()){
 

System.out.println(start "," end); Было добавлено в качестве теста, и при выполнении команды MultiplicationTable 7-11 значения не отображаются. Я что-то не понимаю в том, как работает lookingAt(), или я использую его неправильно?

Комментарии:

1. Является ли использование регулярных выражений частью вашей домашней работы? Потому что я думаю, что в этом случае немного излишне анализировать входные данные с использованием регулярных выражений.

2. Из документации : «Возвращает: true, если и только если префикс входной последовательности соответствует шаблону этого сопоставления »

Ответ №1:

lookingAt() в вашем случае это не сработает, поскольку метод сопоставляет регулярное выражение только с началом текста.

Проще говоря, строка должна начинаться с шаблона регулярных выражений.

Иллюстрация с кодом —

 class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String str1 = "7-11";
        String str2 = "-11";

        String regex = "-";
        Pattern p = Pattern.compile(regex);
        Matcher m1 = p.matcher(str1);
        Matcher m2 = p.matcher(str2);
        System.out.println("Does str1 matches with regex using lookingAt method "   m1.lookingAt());
        System.out.println("Does str2 matches with regex using lookingAt method "   m2.lookingAt());
    }
}
 

Вывод

 Does str1 matches with regex using lookingAt method false
Does str2 matches with regex using lookingAt method true
 

Итак, для вашей проблемы вы можете использовать find() метод, который ищет вхождения регулярных выражений в тексте, передаваемом сопоставителю, если в тексте можно найти несколько совпадений, find() метод найдет первое, а затем для каждого последующего вызова к find() нему перейдет к следующему совпадению.

Вы можете изменить свое условие if на if(m.find()) . Нажмите здесь, чтобы увидеть рабочий код.

Если можно использовать любой другой способ, кроме regex, то вы можете разделить строку, с помощью - которой будет возвращен массив строк.

Например

 public static void main (String[] args){
    String str = "7-11";
    String[] stringArray = str.split("-");

    System.out.println(stringArray[0]); // 7
    System.out.println(stringArray[1]); // 11
}