正则表达式计数<>

时间:2018-09-28 12:02:33

标签: java regex

所以我有这样的情况

<> = 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 :(得分:1)

如果不使用递归,则无法使用Java的正则表达式来做到这一点。但是,一种简单的计数方案有效:以level = 0, count = 0开始,然后遍历字符。对于每个<,增加级别。对于每个>,降低级别并增加count。如果level为负数,则中止(可能有错误),或忽略该字符(取决于您要如何处理<>><<>之类的情况)。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

使用正则表达式很难做到这一点。有限自动机是识别正则表达式的机器,其内存是有限的,因此无法处理未知的嵌套级别。

您必须制作一个与固定深度匹配的正则表达式。

或者您也可以像这样制作自己的算法,这是非常基本的:

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);
    }
}