java lookbehind for split by greedy quantifiers表达式

时间:2016-10-30 12:24:18

标签: java regex greedy quantifiers

我写了下面的表达式,在每个x字(例如3个)后面跟一个空格分割一个字符串。我的问题是我需要保留整个内容。但我无法找到一种方法来使用后面的等等来在Java中实现这一点。

任何人都有这方面的经验吗?

String text = "Hello my name is Tom and i love playing football";
String regex = "([a-zA-Z0-9öÖäÄüÜß]+\\s){" + ngramm_length + "}";
System.out.println(regex);
String[] ngramms = text.split(regex);

结果是4个令牌,但只有最后一个仍然包含内容,我想得到:

  

1: Hello my name 2: is Tom and 3: i love playing 4: football

查看链接JAVA代码中的匹配信息框:

public static void main(String[] args) throws IOException {     
    int length = 3; //2
    String dynamic_length = "";
    for (int i = 1; i < length; i++) {       
        dynamic_length += i;

        if (i + 1 < length) {
            dynamic_length += ",";         
        }
    }

    final String regex = "([a-zA-Z0-9öÖäÄüÜß]+\\s){" + length + "}|([a-zA-Z0-9öÖäÄüÜß]+\\s){" + dynamic_length + "}";
    final String string = "Hello my name is Tom and i love playing football\n\n";

    final Pattern pattern = Pattern.compile(regex);
    final Matcher matcher = pattern.matcher(string);
    int count = 0;
    while (matcher.find()) {
        ++count;
        System.out.println("match:" + count + " " + matcher.group(0));
    }

它不是动态的,因为它只适用于2和3的长度。这是我的问题还是我错过了什么?

表示x&gt; 1我可以使用:

final String regex = "([a-zA-Z0-9öÖäÄüÜß]+\\s){" + length + "}|([a-zA-Z0-9öÖäÄüÜß]+\\s){1," + (length - 1) + "}";

对于x = 1我可以使用:

final String regex = "([a-zA-Z0-9öÖäÄüÜß]+\\s){" + length + "}|([a-zA-Z0-9öÖäÄüÜß]+\\s){1}";

或只按空间分割。

感谢Maverick_Mrt !!!

1 个答案:

答案 0 :(得分:1)

你可以试试这个:

([a-zA-Z0-9öÖäÄüÜß]+\s){3}|([a-zA-Z0-9öÖäÄüÜß]+\s){1,2}

Explanation

查看链接中的匹配信息框 JAVA代码:

public static void main(String[] args) {
    final String regex = "([a-zA-Z0-9öÖäÄüÜß]+\\s){3}|([a-zA-Z0-9öÖäÄüÜß]+\\s){1,2}";
    final String string = "Hello my name is Tom and i love playing football\n\n";

    final Pattern pattern = Pattern.compile(regex);
    final Matcher matcher = pattern.matcher(string);
    int count = 0;
    while (matcher.find()) {
        ++count;
        System.out.println("match:" + count + " " + matcher.group(0));
    }

根据你的评论:

如果您希望每次匹配 n 阻止,那么请确保n&gt; 0

([a-zA-Z0-9öÖäÄüÜß]+\s){n}|([a-zA-Z0-9öÖäÄüÜß]+\s){1,n-1}


Sample output

    match:1 Hello my name 
    match:2 is Tom and 
    match:3 i love playing 
    match:4 football