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