В PHP оба 'my name'
и "my name"
являются строками. Вы можете узнать больше об этом в руководстве по PHP .
Вещь, которую вы должны знать, это
$a = 'name';
$b = "my $a"; == 'my name'
$c = 'my $a'; != 'my name'
. В PHP люди используют одиночную кавычку для определения константа, например 'a'
, 'my name'
, 'abc xyz'
, используя двойную кавычку для определения строки, содержащей идентификатор, такой как "a $b $c $d"
.
И еще:
echo 'my name';
быстрее, чем
echo "my name";
, но
echo 'my ' . $a;
медленнее, чем
echo "my $a";
Это верно для других, используемых в строке.
R не имеет возможности применить функцию непосредственно к совпадению через gsub
. Вам действительно нужно извлечь совпадение, преобразовать значение, а затем заменить значение. С функцией regmatches
это легко релятивируется. Например,
x<-"(990283)M (31)O (29)M (6360)M"
f<-function(x) {
v<-as.numeric(substr(x,2,nchar(x)-1))
paste0(v+5,".1")
}
m <- gregexpr("\\(\\d+\\)", x)
regmatches(x, m) <- lapply(regmatches(x, m), f)
x
# [1] "990288.1M 36.1O 34.1M 6365.1M"
Конечно, вы можете сделать f
делать все, что вам нравится, просто убедиться, что он удобен для вектора. Конечно, вы можете обернуть это в свою собственную функцию
gsubf <- function(pattern, x, f) {
m <- gregexpr(pattern, x)
regmatches(x, m) <- lapply(regmatches(x, m), f)
x
}
gsubf("\\(\\d+\\)", x, f)
. Обратите внимание, что в этих примерах мы не используем группу захвата, мы просто хватаем весь матч. Есть способы извлечь группы захвата, но они немного беспорядочны. Если вы хотите представить пример, где требуется такое извлечение, я мог бы придумать что-то более приятное.
Это для нескольких разных замен.
text="foo(200) (300)bar (400)foo (500)bar (600)foo (700)bar"
f=function(x)
{
return(as.numeric(x[[1]])+5)
}
a=strsplit(text,"\\(\\K\\d+",perl=T)[[1]]
b=f(str_extract_all(text,perl("\\(\\K\\d+")))
paste0(paste0(a[-length(a)],b,collapse=""),a[length(a)]) #final output
#[1] "foo(205) (305)bar (405)foo (505)bar (605)foo (705)bar"