gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:25:38 25 4
gpt4 key购买 nike

我有以下正则表达式模式,我将在其上分割字符串。我不明白这是如何匹配和 split 发生的。我对正则表达式及其工作原理有基本的了解。

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]

最佳答案

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

负向后查找检查括号内的表达式是否与当前位置之前的表达式匹配。所以,在第一个例子中(?<!(^|[A-Z0-9]))它检查前一个位置不是字符串的开头或 [A-Z0-9] 中的任何一个.

先行检查表达式是否紧跟当前位置之后匹配。

因此,如果两个条件之一匹配,则该表达式将拆分:

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

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

关于java - 无法理解这个正则表达式如何对输入字符串进行操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26833023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com