3 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊
這有點(diǎn)狡猾,但是您可以使用replace函數(shù)引入虛擬分隔符。我不知道Java方法,但在C#中可能是這樣的:
string1.Replace("-", "#-").Split("#");
當(dāng)然,您需要選擇一個(gè)虛擬分隔符,該分隔符保證不會(huì)出現(xiàn)在字符串中的任何其他位置。

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超4個(gè)贊
string1.split("(?=-)");
之所以有效,split是因?yàn)閷?shí)際上需要一個(gè)正則表達(dá)式。您實(shí)際上看到的是“零寬度正向超前”。
我想解釋更多,但我的女兒想?yún)⒓硬柙挄?huì)。:)
編輯:回來!
為了解釋這一點(diǎn),我將首先向您展示一個(gè)不同的split操作:
"Ram-sita-laxman".split("");
這會(huì)將您的字符串分割為每個(gè)零長度的字符串。每個(gè)字符之間都有一個(gè)零長度的字符串。因此,結(jié)果是:
["", "R", "a", "m", "-", "s", "i", "t", "a", "-", "l", "a", "x", "m", "a", "n"]
現(xiàn)在,我將我的正則表達(dá)式("")修改為僅匹配零長度的字符串(如果它們后接破折號(hào))。
"Ram-sita-laxman".split("(?=-)");
["Ram", "-sita", "-laxman"]
在該示例中,?=意思是“超前”。更具體地說,這意味著“ 積極向前”。為什么要“積極”?因?yàn)槟€可以使用負(fù)前瞻(?!),所以它將在每個(gè)零長度字符串(不帶破折號(hào))上分割:
"Ram-sita-laxman".split("(?!-)");
["", "R", "a", "m-", "s", "i", "t", "a-", "l", "a", "x", "m", "a", "n"]
您還可以在()后面添加正向后視符號(hào)(lookbehind)(?<=),該符號(hào)將在每個(gè)零長度字符串(以短劃線開頭)處分割:
"Ram-sita-laxman".split("(?<=-)");
["Ram-", "sita-", "laxman"]
最后,您還可以在()后面加上負(fù)數(shù)lookbehind(?<!),以在每個(gè)不帶破折號(hào)的零長度字符串上進(jìn)行分割:
"Ram-sita-laxman".split("(?<!-)");
["", "R", "a", "m", "-s", "i", "t", "a", "-l", "a", "x", "m", "a", "n"]
這四個(gè)表達(dá)式統(tǒng)稱為環(huán)視表達(dá)式。
獎(jiǎng)勵(lì):將它們放在一起
我只是想展示一個(gè)我最近遇到的示例,該示例結(jié)合了兩個(gè)環(huán)視表達(dá)式。假設(shè)您希望將一個(gè)CapitalCase標(biāo)識(shí)符分成其令牌:
"MyAwesomeClass" => ["My", "Awesome", "Class"]
您可以使用以下正則表達(dá)式完成此操作:
"MyAwesomeClass".split("(?<=[a-z])(?=[A-Z])");
這會(huì)在每個(gè)零長度的字符串上分割,該字符串前面是小寫字母((?<=[a-z])),然后是大寫字母((?=[A-Z]))。
此技術(shù)還可以使用camelCase標(biāo)識(shí)符。
添加回答
舉報(bào)