java - (?!^)是什么意思

标签 java regex split

我试图学习正则表达式并感到困惑。
我看到了这篇文章java split () method
所以我对Achintya Jha的第二个回答有一些疑问;


为什么str2.split("");给出为[, 1, 2, 3]
它在文本开头是否检测到"",如果是这样,为什么在末尾却不这样做?
(?!^)到底是什么意思?


如果我没记错的话,如果后面没有a(?!b),则a返回b
并且^查找必须在行首匹配的正则表达式,以便(?!^)获取空字符串""
^查找必须与行首匹配的""
因此,如果此""后面没有"",则返回""

最佳答案

拆分发生在与作为参数传递的正则表达式匹配的地方。您需要知道,如果拆分发生,那么一件事情就变成两件事。总是。也不例外。

您可能会因为实例"abc".split("c")返回带有一个元素["ab"]的数组而感到怀疑,但这是因为此版本的split还会在返回数组之前自动从数组中删除尾随的空字符串。

换句话说"abc".split("c")


创建["ab",""]数组(是的,是一个空字符串,是在"abc"上分割c的结果),
删除尾随的空字符串
作为结果数组返回,结尾没有那些空字符串,因此现在返回["ab"]


另一个示例是在"abc"上拆分"a"。由于开始时存在a,因此您将获得["", "bc"]

但是,在空字符串上分割会比较棘手,因为空字符串在每个字符之前和之后。我将使用管道|标记它们。

因此,可以在这些位置"abc"上找到"|a|b|c|"中的空字符串,这意味着在"abc"上拆分""


此方法(首先)产生数组["", "a", "b", "c", ""]
然后删除尾随的空字符串


这就是为什么"abc".split("")返回结果数组["", "a", "b", "c"]的原因(这应该回答您的问题1)。

但是,如果我们想防止第一个空字符串(开始的那个)被split方法匹配,该怎么办?换句话说,如果我们不想分裂

"|a|b|c|"


但仅在

 "a|b|c|"


我们可以通过几种方式做到这一点。


我们可以尝试创建正则表达式,以匹配这些在其前面具有任何字符的whatspace,例如a| b| c|
我们也可以说,我们想在没有空格开头的whatspace上进行拆分。


要创建此类正则表达式,我们将需要
look-around机制。



要说空Stirng,只需使用""
要说某个东西需要先有其他东西,我们可以使用正向隐藏(?<=.)


如果我们将前面的两个品脱结合在一起:"(?<=.)""",我们将得到"(?<=.)"+"",它就是"(?<=.)",因此"abc".split("(?<=.)")应该只在这些空字符串上分割,这些空字符串以任何字符开头(在以点表示的正则表达式中) .)。
要说不能在字符串的开头保留一些内容,我们可以在后面使用(?<!...)^来表示字符串的开头。因此(?<!^)表示条件“在其之前没有字符串的开头”。这就是为什么"(?<!^)无法匹配此空白的原因

 ↓  
"|a|b|c|"



因为它前面有字符串的开头。

实际上,还有一种特殊情况是您问题(?!^)的要点,这意味着超前看。此正则表达式描述了空字符串,其后没有字符串的开头。这有点不直观,因为以前我们假设字符串的开头(用^表示)放置在此处

 ↓
"^|a|b|c|"


但现在看起来就像在这里:

  ↓
"|^a|b|c|"


那么发生了什么?如何运作?
如前所述,对空字符串进行拆分非常棘手。要了解这一点,您需要查看没有标记为空字符串的字符串,并且您会看到字符串的开头在这里

 ↓
"^abc"


换句话说,正则表达式还将第一个字符(在本例中为"a")之前的位置视为开始,因此

  ↓
"|^a|b|c|"


也有意义并且有效,这就是为什么(?!^)能够看到此空字符串的原因

 ↓
"|^a|b|c|"


恰好在字符串开头之前,并且不会将其视为有效的拆分位置。



无论如何,由于这会使那些对正则表达式不太熟悉的开发人员感到困惑,因此从Java 8开始,我们不必对(?<=.)(?<!^)(?!^)使用技巧,以避免在开始时创建空字符串,因为在这个问题中描述

Why in Java 8 split sometimes removes empty strings at start of result array?

它会自动删除生成的数组开头的空字符串,因为split中使用的长正则表达式表示zero-length字符串(如空字符串),因此您现在可以使用"abc".split("")并得到结果["a", "b", "c"]

关于java - (?!^)是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25071159/

相关文章:

json - 使用命令行工具将 JSON 数组拆分为多个文件

java - 用不同的分隔符分割JAVA

java - 使用 Java 8 中的供应商用泛型列表填充数组抛出删除类型的 ClassCastEx b/c

java - 将捕获的视频存储在特定文件夹中并在视频 View 中播放视频

java - 程序未检测到鼠标点击

python - 在 python 中,如何根据键(相邻组)将元素组合在一起?

java - 在 Java 8 中限制 groupBy

java - 正则表达式 - 在第一个匹配后获取第二个单词

javascript - 正则表达式匹配包含给定一系列字母或数字的所有字符串

javascript - 仅删除数字开头不必要的 0