R數(shù)據(jù)科學(xué)(十) 使用stringr處理字符串

本章將介紹 R 中的字符串處理。將學(xué)習(xí)字符串的基本工作原理,以及如何手工創(chuàng)建字符串棒旗,但本章的重點(diǎn)是正則表達(dá)式(regular expression, regexp)皮壁。正則表達(dá)式的用處非常大椭更,字符串通常包含的是非結(jié)構(gòu)化或半結(jié)構(gòu)化數(shù)據(jù),正則表達(dá)式可以用簡練的語言來描述字符串中的模式蛾魄。

library(tidyverse)
library(stringr)

10.2 字符串基礎(chǔ)

# 創(chuàng)建字符串
string1 <- "This is a string"
string2 <- 'To put a "quote" inside a string, use single quotes'

如果想要在字符串中包含一個單引號或雙引號虑瀑,可以使用 \ 對其進(jìn)行“轉(zhuǎn)義”

double_quote <- "\"" # or '"'
single_quote <- '\'' # or "'"

如果想要在字符串中包含一個反斜杠,就需要使用兩個反斜杠: \
注意滴须,字符串的打印形式與其本身的內(nèi)容不是相同的舌狗,因?yàn)榇蛴⌒问街袝@示出轉(zhuǎn)義字
符。如果想要查看字符串的初始內(nèi)容扔水,可以使用 writelines() 函數(shù)

x <- c("\"", "\\")
x
writeLines(x)

換行符 \n 和制表符 \t
使用 c() 函數(shù)來創(chuàng)建字符向量

c("one", "two", "three")

10.2.1 字符串長度
以 str_ 開頭的痛侍。例如, str_length() 函數(shù)可以返回字符串中的字符數(shù)量

str_length(c("a", "R for data science", NA))

10.2.2 字符串組合

str_c("x", "y")

str_c("x", "y", "z")

str_c("x", "y", sep = ", ")

x <- c("abc", NA)
str_c("|-", x, "-|")

# 和多數(shù) R 函數(shù)一樣魔市,缺失值是可傳染的主届。如果想要將它們輸出為 "NA",可以使用 str_replace_na()
str_c("|-", str_replace_na(x), "-|")

str_c() 函數(shù)是向量化的待德,它可以自動循環(huán)短向量君丁,使得其與最長的向量具有相同的長度

str_c("prefix-", c("a", "b", "c"), "-suffix")

10.2.3 字符串取子集
str_sub() 函數(shù)來提取字符串的一部分。除了字符串參數(shù)外将宪, str_sub() 函數(shù)中還
有 start 和 end 參數(shù)绘闷,它們給出了子串的位置(包括 start 和 end 在內(nèi))

x <- c("Apple", "Banana", "Pear")
str_sub(x, 1, 3)

# 負(fù)數(shù)表示從后往前數(shù)
str_sub(x, -3, -1)

還可以使用 str_sub() 函數(shù)的賦值形式來修改字符串

str_sub(x, 1, 1) <- str_to_lower(str_sub(x, 1, 1))

10.2.5 練習(xí)
(1) 在沒有使用 stringr 的那些代碼中,你會經(jīng)辰咸常看到 paste() 和 paste0() 函數(shù)印蔗,這兩個函
數(shù)的區(qū)別是什么? stringr 中的哪兩個函數(shù)與它們是對應(yīng)的燎潮?這些函數(shù)處理 NA 的方式有
什么不同喻鳄?

paste("foo", "bar")
#> [1] "foo bar"
paste0("foo", "bar")
#> [1] "foobar"

str_c("foo", "bar")
#> [1] "foobar"
str_c("foo", NA)
#> [1] NA
paste("foo", NA)
#> [1] "foo NA"
paste0("foo", NA)
#> [1] "fooNA"

(2) 用自己的語言描述一下 str_c() 函數(shù)的 sep 和 collapse 參數(shù)有什么區(qū)別?

(3) 使用 str_length() 和 str_sub() 函數(shù)提取出一個字符串最中間的字符确封。如果字符串中的
字符數(shù)是偶數(shù)除呵,你應(yīng)該怎么做?

x <- c("a", "abc", "abcd", "abcde", "abcdef")
L <- str_length(x)
m <- ceiling(L / 2)
str_sub(x, m, m)
#> [1] "a" "b" "b" "c" "c"

(4) str_wrap() 函數(shù)的功能是什么爪喘?應(yīng)該在何時使用這個函數(shù)颜曾?
將文本處理成固定寬度的文本

thanks_path <- file.path(R.home('doc'),'thanks')
thanks <- str_c(readLines(thanks_path),collapse = '\n')
thanks <- word(thanks,1,3,fixed("\n\n"))
cat(str_wrap(thanks),"\n")

(5) str_trim() 函數(shù)的功能是什么?其逆操作是哪個函數(shù)秉剑?
str_trim()去除字符串兩邊的空格泛豪,str_pad()在兩邊增加空格

str_trim(" abc ")
#> [1] "abc"
str_trim(" abc ", side = "left")
#> [1] "abc "
str_trim(" abc ", side = "right")
#> [1] " abc"

str_pad("abc", 5, side = "both")
#> [1] " abc "
str_pad("abc", 4, side = "right")
#> [1] "abc "
str_pad("abc", 4, side = "left")
#> [1] " abc"

(6) 編寫一個函數(shù)將字符向量轉(zhuǎn)換為字符串,例如,將字符向量 c("a", "b", "c") 轉(zhuǎn)換為
字符串 a诡曙、 b 和 c臀叙。仔細(xì)思考一下,如果給定一個長度為 0价卤、 1 或 2 的向量劝萤,那么這個函
數(shù)應(yīng)該怎么做?

str_commasep <- function(x, delim = ",") {
  n <- length(x)
  if (n == 0) {
    ""
  } else if (n == 1) {
    x
  } else if (n == 2) {
    # no comma before and when n == 2
    str_c(x[[1]], "and", x[[2]], sep = " ")
  } else {
    # commas after all n - 1 elements
    not_last <- str_c(x[seq_len(n - 1)], delim)
    # prepend "and" to the last element
    last <- str_c("and", x[[n]], sep = " ")
    # combine parts with spaces
    str_c(c(not_last, last), collapse = " ")
  }
}
str_commasep("")
#> [1] ""
str_commasep("a")
#> [1] "a"
str_commasep(c("a", "b"))
#> [1] "a and b"
str_commasep(c("a", "b", "c"))
#> [1] "a, b, and c"
str_commasep(c("a", "b", "c", "d"))
#> [1] "a, b, c, and d"

10.3 使用正則表達(dá)式進(jìn)行模式匹配
10.3.1 基礎(chǔ)匹配

x <- c("apple", "banana", "pear")
str_view(x, "an")

str_view(x, ".a.")

# 要想建立正則表示式慎璧,我們需要使用\\
dot <- "\\."
# 實(shí)際上表達(dá)式本身只包含一個\:
writeLines(dot)
#> \.
# 這個表達(dá)式告訴R搜索一個.
str_view(c("abc", "a.c", "bef"), "a\\.c")

x <- "a\\b"
writeLines(x)
#> a\b
str_view(x, "\\\\")

正則表達(dá)式 . 的字符串形式應(yīng)是 \. 你需要 4 個反斜杠來匹配 1 個反斜杠床嫌!

10.3.2 練習(xí)
(1) 解釋一下為什么這些字符串不能匹配一個反斜杠 \: ""、 "\"胸私、 "\"厌处。
(2) 如何匹配字符序列 "'\ ?
(3) 正則表達(dá)式 ...... 會匹配哪種模式岁疼?如何用字符串來表示這個正則表達(dá)式阔涉?

10.3.3 錨點(diǎn)
有時我們需要在正則表達(dá)式中設(shè)置錨點(diǎn),以便 R 從字符串的開頭或末尾進(jìn)行匹配捷绒。我們可以設(shè)置兩種錨點(diǎn)洒敏。
? ^ 從字符串開頭進(jìn)行匹配。
? $ 從字符串末尾進(jìn)行匹配疙驾。

x <- c("apple", "banana", "pear")
str_view(x, "^a")

str_view(x, "a$")

x <- c("apple pie", "apple", "apple cake")
str_view(x, "apple")
str_view(x, "^apple$")

始于權(quán)力(^)凶伙,終于金錢($)

10.3.4 練習(xí)
(1) 如何匹配字符串 "^" ? \$\\$$

str_view(c("$^$", "ab$^$sfas"), "^\\$\\^\\$$")

(2) 給定 stringr::words 中的常用單詞語料庫它碎,創(chuàng)建正則表達(dá)式以找出滿足下列條件的所
有單詞函荣。
a. 以 y 開頭的單詞。
b. 以 x 結(jié)尾的單詞扳肛。
c. 長度正好為 3 個字符的單詞傻挂。(不要使用 str_length() 函數(shù),這是作弊M谙ⅰ)
d. 具有 7 個或更多字符的單詞金拒。
因?yàn)檫@個列表非常長,所以你可以設(shè)置 str_view() 函數(shù)的 match 參數(shù)套腹,只顯示匹配的
單詞(match = TRUE)或未匹配的單詞(match = FALSE)绪抛。

word <- stringr::words
str_view(word,"^y",match = T)
str_view(word,"x$",match = T)
str_view(word,"^...$",match = T)
str_view(word,".......",match = T)

10.3.5 字符類與字符選項(xiàng)
? \d 可以匹配任意數(shù)字。
? \s 可以匹配任意空白字符(如空格电禀、制表符和換行符)幢码。
? [abc] 可以匹配 a、 b 或 c尖飞。
? [^abc] 可以匹配除 a症副、 b店雅、 c 外的任意字符。

10.3.6 練習(xí)
(1) 創(chuàng)建正則表達(dá)式來找出符合以下條件的所有單詞贞铣。
a. 以元音字母開頭的單詞闹啦。

str_view(word,"^[aeiou]",match = T)

b. 只包含輔音字母的單詞(提示:考慮一下匹配“非”元音字母)。

str_view(word,"^[^aeiou]+$",match = T)

c. 以 ed 結(jié)尾辕坝,但不以 eed 結(jié)尾的單詞亥揖。

str_view(word,"ed$|^[^e]ed$",match = T)

d. 以 ing 或 ize 結(jié)尾的單詞。

str_view(word,"ing$|ize$",match = T)
str_view(stringr::words, "i(ng|se)$", match = TRUE)

(2) 實(shí)際驗(yàn)證一下規(guī)則: i 總是在 e 前面圣勒,除非 i 前面有 c。

str_view(stringr::words, "(cei|[^c]ie)", match = TRUE)

(3) q 后面總是跟著一個 u 嗎摧扇?

str_view(stringr::words, "qu", match = TRUE)

(4) 編寫一個正則表達(dá)式來匹配英式英語單詞圣贸,排除美式英語單詞。

(5) 創(chuàng)建一個正則表達(dá)式來匹配你所在國家的電話號碼扛稽。

x <- c("123-4560-7890", "1235-2351")
str_view(x, "\\d\\d\\d-\\d\\d\\d\\d-\\d\\d\\d\\d")

10.3.7 重復(fù)
正則表達(dá)式的另一項(xiàng)強(qiáng)大功能是吁峻,其可以控制一個模式能夠匹配多少次。
? ?: 0 次或 1 次在张。
? +: 1 次或多次用含。
? *: 0 次或多次。

x <- "1888 is the longest year in Roman numerals: MDCCCLXXXVIII"
str_view(x, "CC?")
str_view(x, "CC+")
str_view(x, 'C[LX]+')

? {n}:匹配 n 次帮匾。
? {n,}:匹配 n 次或更多次啄骇。
? {,m}:最多匹配 m 次。
? {n, m}:匹配 n 到 m 次瘟斜。

str_view(x, "C{2}")
str_view(x, "C{2,}")
str_view(x, "C{2,3}")

默認(rèn)的匹配方式是“貪婪的”:正則表達(dá)式會匹配盡量長的字符串缸夹。通過在正則表達(dá)式后
面添加一個 ?,你可以將匹配方式更改為“懶惰的”螺句,即匹配盡量短的字符串虽惭。
10.3.8 練習(xí)
(1) 給出與 ?、 + 和 * 等價的 {m, n} 形式的正則表達(dá)式蛇尚。
? {0,1} + {1,} * {0,}
(2) 用語言描述以下正則表達(dá)式匹配的是何種模式(仔細(xì)閱讀來確認(rèn)我們使用的是正則表達(dá)
式芽唇,還是定義正則表達(dá)式的字符串)?
a. ^.*$
b. "\{.+\}"
c. \d{4}-\d{2}-\d{2}
d. "\\{4}"
(3) 創(chuàng)建正則表達(dá)式來找出滿足以下條件的所有單詞取劫。
a. 以 3 個輔音字母開頭的單詞
b. 有連續(xù) 3 個或更多元音字母的單詞匆笤。
c. 有連續(xù) 2 個或更多元音—輔音配對的單詞。

str_view(stringr::words, "^[^aeiou]{3}",match=T)
str_view(stringr::words, "[aeiou]{3,}",match=T)
str_view(stringr::words, "[aeiou][^aeiou]{2,}",match=T)

括號還可以定義“分組”谱邪,你可以通過回溯引用(如 \1疚膊、 \2 等)來引用這些分組。

str_view(stringr::words, "(..)\\1", match = TRUE)

10.4.1 匹配檢測

x <- c("apple", "banana", "pear")
str_detect(x, "e")
#> [1] TRUE FALSE TRUE

# 有多少個以t開頭的常用單詞虾标?
sum(str_detect(words, "^t"))
#> [1] 65
# 以元音字母結(jié)尾的常用單詞的比例是多少寓盗?
mean(str_detect(words, "[aeiou]$"))
#> [1] 0.277

str_detect() 函數(shù)的一種常見用法是選取出匹配某種模式的元素灌砖。你可以通過邏輯取子集
方式來完成這種操作,也可以使用便捷的 str_subset() 包裝器函數(shù):

words[str_detect(words, "x$")]
#> [1] "box" "sex" "six" "tax"
str_subset(words, "x$")
#> [1] "box" "sex" "six" "tax"

df <- tibble(
word = words,
i = seq_along(word)
)
df %>%
filter(str_detect(words, "x$"))

str_detect() 函數(shù)的一種變體是 str_count()傀蚌,后者不是簡單地返回是或否基显,而是返回字符
串中匹配的數(shù)量:

x <- c("apple", "banana", "pear")
str_count(x, "a")
#> [1] 1 3 1
# 平均來看,每個單詞中有多少個元音字母善炫?
mean(str_count(words, "[aeiou]"))
#> [1] 1.99

df %>%
mutate(
vowels = str_count(word, "[aeiou]"),
consonants = str_count(word, "[^aeiou]")
)

str_count("abababa", "aba")
#> [1] 2
str_view_all("abababa", "aba")

10.4.3 提取匹配內(nèi)容
要想提取匹配的實(shí)際文本撩幽,我們可以使用 str_extract() 函數(shù)。為了說明這個函數(shù)的用

length(sentences)
#> [1] 720
head(sentences)

colors <- c(
"red", "orange", "yellow", "green", "blue", "purple"
)
color_match <- str_c(colors, collapse = "|")
color_match
#> [1] "red|orange|yellow|green|blue|purple"

has_color <- str_subset(sentences, color_match)
matches <- str_extract(has_color, color_match)
head(matches)
#> [1] "blue" "blue" "red" "red" "red" "blue"

more <- sentences[str_count(sentences, color_match) > 1]
str_view_all(more, color_match)
str_extract(more, color_match)
#> [1] "blue" "green" "orange

str_extract_all(more, color_match)
#> [[1]]
#> [1] "blue" "red"
#>
#> [[2]]
#> [1] "green" "red"
#>
#> [[3]]
#> [1] "orange" "red"

str_extract() 函數(shù)可以給出完整匹配箩艺; str_match() 函數(shù)則可以給出每個獨(dú)立分組窜醉。 str_
match() 返回的不是字符向量,而是一個矩陣艺谆,其中一列是完整匹配榨惰,后面的列是每個分
組的匹配

noun <- "(a|the) ([^ ]+)"
has_noun <- sentences %>%
str_subset(noun) %>%
head(10)
has_noun %>%
str_extract(noun)
#> [1] "the smooth" "the sheet" "the depth" "a chicken"
#> [5] "the parked" "the sun" "the huge" "the ball"
#> [9] "the woman" "a helps"
has_noun %>%
str_match(noun)
#> [,1] [,2] [,3]
#> [1,] "the smooth" "the" "smooth"
#> [2,] "the sheet" "the" "sheet"
#> [3,] "the depth" "the" "depth"
#> [4,] "a chicken" "a" "chicken"
#> [5,] "the parked" "the" "parked"
#> [6,] "the sun" "the" "sun"
#> [7,] "the huge" "the" "huge"
#> [8,] "the ball" "the" "ball"
#> [9,] "the woman" "the" "woman"
#> [10,] "a helps" "a" "helps"
# 如果數(shù)據(jù)是保存在 tibble 中的,那么使用 tidyr::extract() 會更容易静汤。這個函數(shù)的工作方式
#與 str_match() 函數(shù)類似琅催,只是要求為每個分組提供一個名稱,以作為新列放在 tibble 中
tibble(sentence = sentences) %>%
tidyr::extract(
sentence, c("article", "noun"), "(a|the) ([^ ]+)",
remove = FALSE
)

10.4.7 替換匹配內(nèi)容
str_replace() 和 str_replace_all() 函數(shù)可以使用新字符串替換匹配內(nèi)容虫给。

x <- c("apple", "pear", "banana")
str_replace(x, "[aeiou]", "-")
#> [1] "-pple" "p-ar" "b-nana"
str_replace_all(x, "[aeiou]", "-")
#> [1] "-ppl-" "p--r" "b-n-n-"

x <- c("1 house", "2 cars", "3 people")
str_replace_all(x, c("1" = "one", "2" = "two", "3" = "three"))
#> [1] "one house" "two cars" "three people

10.4.9 拆分
str_split() 函數(shù)可以將字符串拆分為多個片段藤抡。

sentences %>%
head(5) %>%
str_split(" ")

"a|b|c|d" %>%
str_split("\\|") %>%
.[[1]]
sentences %>%
head(5) %>%
str_split(" ", simplify = TRUE) # simplify=T返回一個矩陣
fields <- c("Name: Hadley", "Country: NZ", "Age: 35")
fields %>% str_split(": ", n = 2, simplify = TRUE)
#> [,1] [,2]
#> [1,] "Name" "Hadley"
#> [2,] "Country" "NZ"
#> [3,] "Age" "35"

apropos() 函數(shù)可以在全局環(huán)境空間中搜索所有可用對象。當(dāng)不能確切想起函數(shù)名稱時抹估,
這個函數(shù)特別有用:

apropos("replace")

dir() 函數(shù)可以列出一個目錄下的所有文件缠黍。 dir() 函數(shù)的 patten 參數(shù)可以是一個正則
表達(dá)式,此時它只返回與這個模式相匹配的文件名药蜻。例如嫁佳,你可以使用以下代碼返回當(dāng)
前目錄中的所有 R Markdown 文件

head(dir(pattern = "\\.Rmd$"))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谷暮,隨后出現(xiàn)的幾起案子蒿往,更是在濱河造成了極大的恐慌,老刑警劉巖湿弦,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓤漏,死亡現(xiàn)場離奇詭異,居然都是意外死亡颊埃,警方通過查閱死者的電腦和手機(jī)蔬充,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來班利,“玉大人饥漫,你說我怎么就攤上這事÷薇辏” “怎么了庸队?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵积蜻,是天一觀的道長。 經(jīng)常有香客問我彻消,道長竿拆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任宾尚,我火速辦了婚禮丙笋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘煌贴。我一直安慰自己御板,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布牛郑。 她就那樣靜靜地躺著怠肋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪井濒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天列林,我揣著相機(jī)與錄音瑞你,去河邊找鬼。 笑死希痴,一個胖子當(dāng)著我的面吹牛者甲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播砌创,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼虏缸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嫩实?” 一聲冷哼從身側(cè)響起刽辙,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甲献,沒想到半個月后宰缤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晃洒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年慨灭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片球及。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡氧骤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吃引,到底是詐尸還是另有隱情筹陵,我是刑警寧澤刽锤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站惶翻,受9級特大地震影響姑蓝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吕粗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一纺荧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颅筋,春花似錦宙暇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至先口,卻和暖如春型奥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碉京。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工厢汹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谐宙。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓烫葬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凡蜻。 傳聞我的和親對象是個殘疾皇子搭综,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 在挖掘分析的過程當(dāng)中對字符串的處理是極為重要的,且出現(xiàn)也較為頻繁划栓,R語言作為當(dāng)前最為流行的開源數(shù)據(jù)分析和可視化平臺...
    果果哥哥BBQ閱讀 5,793評論 0 8
  • 前言 最先接觸編程的知識是在大學(xué)里面忠荞,大學(xué)里面學(xué)了一些基礎(chǔ)的知識闪朱,c語言,java語言钻洒,單片機(jī)的匯編語言等奋姿;大學(xué)畢...
    oceanfive閱讀 3,044評論 0 7
  • 一、正則表達(dá)式的用途(搜索和替換) 1.1.正則表達(dá)式(regular expression,簡稱regex)是一...
    IIronMan閱讀 10,102評論 0 14
  • 一素标、Java 簡介 Java是由Sun Microsystems公司于1995年5月推出的Java面向?qū)ο蟪绦蛟O(shè)計(jì)...
    子非魚_t_閱讀 4,154評論 1 44
  • 《論語別裁》中有這樣一個故事“獅子搏物”称诗,“獅子是百獸之王,獅子何以會是百獸之王头遭?因?yàn)樗麑θ魏问虑槎己芄Ь丛⒚猓?..
    曉梅1125閱讀 365評論 0 1