3 回答
TA贡献1785条经验 获得超4个赞
这有点狡猾,但是您可以使用replace函数引入虚拟分隔符。我不知道Java方法,但在C#中可能是这样的:
string1.Replace("-", "#-").Split("#");
当然,您需要选择一个虚拟分隔符,该分隔符保证不会出现在字符串中的任何其他位置。
TA贡献1851条经验 获得超4个赞
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"]
您还可以在()后面添加正向后视符号(lookbehind)(?<=),该符号将在每个零长度字符串(以短划线开头)处分割:
"Ram-sita-laxman".split("(?<=-)");
["Ram-", "sita-", "laxman"]
最后,您还可以在()后面加上负数lookbehind(?<!),以在每个不带破折号的零长度字符串上进行分割:
"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]))。
此技术还可以使用camelCase标识符。
添加回答
举报