gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:01:18 25 4
gpt4 key购买 nike

我试图学习正则表达式并感到困惑。
我看到了这篇文章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/

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