Tôi muốn tìm vị trí của một ký tự trong một chuỗi.
Nói: string = "the2quickbrownfoxeswere2tired"
Tôi muốn hàm trả về 4
và 24
- vị trí ký tự của 2
s trong string
.
Tôi muốn tìm vị trí của một ký tự trong một chuỗi.
Nói: string = "the2quickbrownfoxeswere2tired"
Tôi muốn hàm trả về 4
và 24
- vị trí ký tự của 2
s trong string
.
Câu trả lời:
Bạn có thể dùng gregexpr
gregexpr(pattern ='2',"the2quickbrownfoxeswere2tired")
[[1]]
[1] 4 24
attr(,"match.length")
[1] 1 1
attr(,"useBytes")
[1] TRUE
hoặc có thể str_locate_all
từ gói stringr
là trình bao bọc (kể từ phiên bản 1.0)gregexpr
stringi::stri_locate_all
stringr
library(stringr)
str_locate_all(pattern ='2', "the2quickbrownfoxeswere2tired")
[[1]]
start end
[1,] 4 4
[2,] 24 24
lưu ý rằng bạn chỉ có thể sử dụng stringi
library(stringi)
stri_locate_all(pattern = '2', "the2quickbrownfoxeswere2tired", fixed = TRUE)
Một tùy chọn khác trong cơ sở R
sẽ giống như
lapply(strsplit(x, ''), function(x) which(x == '2'))
sẽ hoạt động (được cung cấp một vectơ ký tự x
)
regexpr
thay vì gregexpr
để lấy số nguyên một cách dễ dàng. Hoặc sử dụng unlist
trên đầu ra như được chỉ ra trong một câu trả lời khác bên dưới.
Đây là một giải pháp thay thế đơn giản khác.
> which(strsplit(string, "")[[1]]=="2")
[1] 4 24
[[1]]
không?
Bạn có thể đặt đầu ra chỉ 4 và 24 bằng cách sử dụng không công khai:
unlist(gregexpr(pattern ='2',"the2quickbrownfoxeswere2tired"))
[1] 4 24
tìm vị trí xuất hiện thứ n của str2 trong str1 (cùng thứ tự tham số với Oracle SQL INSTR), trả về 0 nếu không tìm thấy
instr <- function(str1,str2,startpos=1,n=1){
aa=unlist(strsplit(substring(str1,startpos),str2))
if(length(aa) < n+1 ) return(0);
return(sum(nchar(aa[1:n])) + startpos+(n-1)*nchar(str2) )
}
instr('xxabcdefabdddfabx','ab')
[1] 3
instr('xxabcdefabdddfabx','ab',1,3)
[1] 15
instr('xxabcdefabdddfabx','xx',2,1)
[1] 0
Để chỉ tìm các vị trí đầu tiên , hãy sử dụng lapply()
với min()
:
my_string <- c("test1", "test1test1", "test1test1test1")
unlist(lapply(gregexpr(pattern = '1', my_string), min))
#> [1] 5 5 5
# or the readable tidyverse form
my_string %>%
gregexpr(pattern = '1') %>%
lapply(min) %>%
unlist()
#> [1] 5 5 5
Để chỉ tìm các vị trí cuối cùng , hãy sử dụng lapply()
với max()
:
unlist(lapply(gregexpr(pattern = '1', my_string), max))
#> [1] 5 10 15
# or the readable tidyverse form
my_string %>%
gregexpr(pattern = '1') %>%
lapply(max) %>%
unlist()
#> [1] 5 10 15
.indexOf()
cái gì đó?