string1.split("(?=-)");
这段代码之所以能够运行,是因为
split
实际上使用了一个
正则表达式。你看到的实际上是一个“零宽度正向预查”。
我很想多解释一些,但是我女儿想要玩茶会。:)
编辑:回来了!
为了解释这个问题,我首先会展示一个不同的
split
操作:
"Ram-sita-laxman".split("");
这将在每个零长度的字符串上分割您的字符串。在每个字符之间有一个零长度的字符串。因此,结果是:
["", "R", "a", "m", "-", "s", "i", "t", "a", "-", "l", "a", "x", "m", "a", "n"]
现在,我修改了我的正则表达式(
""
),只有当零长度字符串后面跟着一个破折号时才匹配。
"Ram-sita-laxman".split("(?=-)");
["Ram", "-sita", "-laxman"]
在这个例子中,
?=
的意思是“向前查看”。更具体地说,它表示“正向查看”。为什么是“正向”的呢?因为你还可以有“负向”的向前查看(
?!
),它会在任何
不紧随着破折号的零长度字符串处分割:
"Ram-sita-laxman".split("(?!-)");
["", "R", "a", "m-", "s", "i", "t", "a-", "l", "a", "x", "m", "a", "n"]
你还可以使用正向预查 (?<=
),它会在每个由连字符前导的零长度字符串处进行拆分:
"Ram-sita-laxman".split("(?<=-)");
["Ram-", "sita-", "laxman"]
最后,您还可以使用
负向回顾后断言(
?<!
),它将在每个长度为零的字符串上拆分,这些字符串
不是以破折号开头:
"Ram-sita-laxman".split("(?<!-)");
["", "R", "a", "m", "-s", "i", "t", "a", "-l", "a", "x", "m", "a", "n"]
这四个表达式被称为“环视”表达式。
奖励:将它们组合在一起
我只是想展示一个最近遇到的例子,该例子结合了两个环视表达式。假设您希望将CapitalCase标识符拆分为其标记:
"MyAwesomeClass" => ["My", "Awesome", "Class"]
你可以使用以下正则表达式来完成这个任务:
"MyAwesomeClass".split("(?<=[a-z])(?=[A-Z])");
这个方法会在每个小写字母前面(
(?<=[a-z])
)且在每个大写字母后面(
(?=[A-Z])
)分割字符串,包括零长度的字符串。
这种技术也适用于驼峰式标识符。
ram,-,sita,-,laxman
。 - dwjohnston"Ram-sita-laxman".split("(?<=-)");
的结果是一个字符串["Ram-sita-laxman"]
。 - AturSams