Регулярное выражение для подсчета <> - PullRequest
0 голосов
/ 28 сентября 2018

Итак, у меня есть такой случай

<> = 1
<><> = 2
<<>> = 2
<<test<> = 1

Как мне найти все "<>" внутри "<>", а также использовать регулярное выражение?

Вот код, который я пробовал.

import java.io.IOException;
import java.util.regex.*;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner s = new Scanner(System.in);
        String input = s.nextLine();

        Pattern p = Pattern.compile("<(.*?)>");
        Matcher m = p.matcher(input);

        int count = 0;
        while(m.find()){
            count++;
        }

        System.out.println(count);
    }
}

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

начать с переменной count и пустым стеком.Вы должны решить эту проблему, используя stack, итерируя по каждому символу, когда вы обнаружите, что < толкает его в стек, в то время, как вы найдете >, выскочите из стека, пока стек не пуст и увеличьте ваш счет.

Редактировать: используя стек

import java.util.*;
public class Test {
      public static void main(String[] args) { 
      Stack<String> myStack = new Stack<String>();
      String str = "<<test<> = 1 <><>";
      int count=0;
      char[] chs = str.toCharArray();    
          for(char ch: chs){
            if(ch == '<'){
                myStack.push(String.valueOf(ch));               
            }
            if( !myStack.isEmpty() & (ch == '>')){
                myStack.pop();
                count++;
            }
          }
      System.out.println("count = "+count); 

      }
    }

вывод

count = 3
0 голосов
/ 28 сентября 2018

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

Вы должны сделать регулярное выражение, соответствующее фиксированной глубине.

Или, в качестве альтернативы, вы можете сделать свой собственный алгоритм, например, такой, он очень прост:

import java.lang.Math;
import java.util.*;


public class HelloWorld {
    public static void main(String[] args) {
        String s = "<<test<>";
        List <Character> l = new ArrayList <Character>();
        int count = 0;

        for (char e: s.toCharArray()) {
            if (e == '<') {
                l.add(e);
            } else if (e == '>') {
                if (l.size() > 0) {
                    l.remove(l.size() - 1);
                    count++;
                }
            }
        }

        System.out.println(count);
    }
}
0 голосов
/ 28 сентября 2018

Вы не можете сделать это с помощью регулярных выражений Java без использования рекурсии.Однако работает простая схема подсчета: начните с level = 0, count = 0, затем итерируйте символы.За каждый < повышайте уровень.Для каждого > уменьшайте уровень и увеличивайте count.Если level имеет отрицательное значение, прервать (возможно, с ошибкой) или игнорировать этот символ (в зависимости от того, как вы хотите обработать такие случаи, как <>><<>).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...