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標識符。
添加回答
舉報