我有以下正则表达式模式,我正在拆分字符串。我不明白这是如何匹配的,并且发生了分裂。我对正则表达式及其工作方式有基本的了解。
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]
答案 0 :(得分:1)
此表达式同时使用负面后瞻(?<!
)和正前瞻(?=
)。
负面后卫检查paranthesis内的表达式是否在当前位置之前匹配。因此,在第一个示例(?<!(^|[A-Z0-9]))
中,它检查前一个位置是不是字符串的开头还是[A-Z0-9]
的任何一个。
前瞻检查表达式是否在当前位置之后立即匹配。
因此,如果两个条件中的一个匹配,则此表达式将分裂:
(?<!(^|[A-Z0-9]))(?=[A-Z])
- 如果前一个字符不是字符串(^
)或A-Z0-9
的开头且下一个字符是A-Z
,则匹配。换句话说,它在这里的任何地方都不会匹配
它匹配的示例是UrlMatching
,它在l
和M
之间匹配。
(?<!^)(?=[A-Z][a-z])
- 如果前一个字符不是字符串的开头,则匹配,接下来的两个字符是大写字母(A-Z
),后跟小写字母( a-z
)。这仅匹配在大写L
之前的一个地方,为您提供您观察到的输出。