无法理解这个正则表达式如何对输入字符串进行操作?

时间:2014-11-09 20:34:57

标签: java regex

我有以下正则表达式模式,我正在拆分字符串。我不明白这是如何匹配的,并且发生了分裂。我对正则表达式及其工作方式有基本的了解。

public class URLmatching {

    private static final Pattern SPLIT_PATTERN = Pattern.compile("(?<!(^|[A-Z0-9]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])");


    public void print() throws URISyntaxException{

        System.out.println(this.getClass().getSimpleName());
        final String[] string = SPLIT_PATTERN.split(getClass().getSimpleName());
        System.out.println(Arrays.toString(string));
    }

    public static void main(String[] args) throws URISyntaxException{

URLmatching u = new URLmatching();
        u.print();
    }
}

输出:

URLmatching
[UR, Lmatching]

1 个答案:

答案 0 :(得分:1)

此表达式同时使用负面后瞻(?<!)和正前瞻(?=)。

负面后卫检查paranthesis内的表达式是否在当前位置之前匹配。因此,在第一个示例(?<!(^|[A-Z0-9]))中,它检查前一个位置是不是字符串的开头还是[A-Z0-9]的任何一个。

前瞻检查表达式是否在当前位置之后立即匹配。

因此,如果两个条件中的一个匹配,则此表达式将分裂:

  1. (?<!(^|[A-Z0-9]))(?=[A-Z]) - 如果前一个字符不是字符串(^)或A-Z0-9的开头且下一个字符是A-Z,则匹配。换句话说,它在这里的任何地方都不会匹配 它匹配的示例是UrlMatching,它在lM之间匹配。

  2. (?<!^)(?=[A-Z][a-z]) - 如果前一个字符不是字符串的开头,则匹配,接下来的两个字符是大写字母(A-Z),后跟小写字母( a-z)。这仅匹配在大写L之前的一个地方,为您提供您观察到的输出。