标签: gsub

Ruby,gsub和regex

快速背景:我有一个字符串,其中包含对其他页面的引用.页面链接使用格式:"#12".哈希后跟页面的ID.

说我有以下字符串:

str = 'This string links to the pages #12 and #125'
Run Code Online (Sandbox Code Playgroud)

我已经知道需要链接的页面的ID:

page_ids = str.scan(/#(\d*)/).flatten
=> [12, 125]
Run Code Online (Sandbox Code Playgroud)

如何遍历页面ID并将#12和#125链接到各自的页面?我遇到的问题是如果我执行以下操作(在rails中):

page_ids.each do |id|
  str = str.gsub(/##{id}/, link_to("##{id}", page_path(id))
end
Run Code Online (Sandbox Code Playgroud)

这适用于#12,但它将#125的"12"部分链接到ID为12的页面.

任何帮助都是极好的.

ruby regex ruby-on-rails gsub

9
推荐指数
2
解决办法
2万
查看次数

为什么String#gsub会双重内容?

s = "#main= 'quotes'
s.gsub "'", "\\'" # => "#main= quotes'quotes"
Run Code Online (Sandbox Code Playgroud)

这似乎是错误的,我希望得到 "#main= \\'quotes\\'"

当我不使用转义字符时,它按预期工作.

s.gsub "'", "*" # => "#main= *quotes*"
Run Code Online (Sandbox Code Playgroud)

所以必须与逃避有关.

使用ruby 1.9.2p290

我需要用反斜杠和引号替换单引号.

更多的不一致:

"\\'".length # => 2
"\\*".length # => 2

# As expected
"'".gsub("'", "\\*").length # => 2
"'a'".gsub("'", "\\*") # => "\\*a\\*" (length==5)

# WTF next:
"'".gsub("'", "\\'").length # => 0

# Doubling the content?
"'a'".gsub("'", "\\'") # => "a'a" (length==3)
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

ruby regex ruby-on-rails gsub

9
推荐指数
1
解决办法
1009
查看次数

与gsub的怪异

我试图gsub在rails应用程序中删除字符串中的非单词字符.我使用了以下代码:

somestring.gsub(/[\W]/i, '')  #=> ""
Run Code Online (Sandbox Code Playgroud)

但它实际上是不正确的,它也会删除字母k.正确的应该是:

somestring.gsub(/\W/i, '')  #=> "kkk"
Run Code Online (Sandbox Code Playgroud)

但我的问题是使用rspec包含上述代码的rails控制器的单元测试不起作用,单元测试实际上通过了.所以我在rspec中创建了一个非常极端的测试用例

it "test this gsub" do
  'kkk'.gsub(/[\W]/i, '').should == 'kkk'
end
Run Code Online (Sandbox Code Playgroud)

上面的测试用例应该失败,但它实际上已经过去了.这里有什么问题?为什么测试通过?

ruby regex rspec gsub ruby-1.9

9
推荐指数
1
解决办法
913
查看次数

正确使用ruby字符串中的gsub

我有这个表达式:

channelName = rhash["Channel"].gsub("'", " ")
Run Code Online (Sandbox Code Playgroud)

它工作正常.但是,我只能用它替换1个字符.我想为替换添加一些字符.所以我尝试了以下方法:

channelName = rhash["Channel"].gsub(/[':;] /, " ")
Run Code Online (Sandbox Code Playgroud)

这不起作用,即没有对字符串进行替换,也没有错误消息.我也试过这个:

channelName = rhash["Channel"].gsub!("'", " ")
Run Code Online (Sandbox Code Playgroud)

这导致一个空白的字符串.所以绝对不是我想要的.

我想有一个gsub方法用我的字符串中的空格替换以下字符:

 ' ; :
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 如何构建我的gsub方法,以便用空格替换上述字符的所有实例?

  2. gsub发生了什么事!以上为空白.

ruby string gsub

9
推荐指数
2
解决办法
3万
查看次数

R中字符向量的快速转义/去除

要在json中编码字符串,需要使用反斜杠转义几个保留字符,并且每个字符串都需要用双引号括起来.目前,该jsonlite包使用deparse基R中的函数实现了这个:

deparse_vector <- function(x) {
  stopifnot(is.character(x))
  vapply(x, deparse, character(1), USE.NAMES=FALSE)
}
Run Code Online (Sandbox Code Playgroud)

这样做的诀窍:

test <- c("line\nline", "foo\\bar", "I said: \"hi!\"")
cat(deparse_vector(test))
Run Code Online (Sandbox Code Playgroud)

然而deparse,对于大型载体来说,结果却很慢.另一种实现是gsub单独为每个角色:

deparse_vector2 <- function(x) {
  stopifnot(is.character(x))
  if(!length(x)) return(x)
  x <- gsub("\\", "\\\\", x, fixed=TRUE)
  x <- gsub("\"", "\\\"", x, fixed=TRUE)
  x <- gsub("\n", "\\n", x, fixed=TRUE)
  x <- gsub("\r", "\\r", x, fixed=TRUE)
  x <- gsub("\t", "\\t", x, fixed=TRUE)
  x <- gsub("\b", "\\b", x, fixed=TRUE)
  x <- gsub("\f", "\\f", x, fixed=TRUE)
  paste0("\"", x, …
Run Code Online (Sandbox Code Playgroud)

regex r escaping gsub

9
推荐指数
2
解决办法
544
查看次数

如何在R中的正则表达式中避开闭括号"]"

我正在尝试使用gsubR来替换我正在处理的一些字符串中的一堆奇怪的字符.一切正常,除非我投入"]",这使整个事情无所作为.我正在使用\\,gsub("[\\?\\*\\]]", "", name)但它仍然无法正常工作.这是我的实际例子:

name <- "R U Still Down? [Remember Me]"
Run Code Online (Sandbox Code Playgroud)

我想要的是:names成为"R U Still Down Remember Me"

当我这样做: names <- gsub("[\\(\\)\\*\\$\\+\\?'\\[]", "", name) 它半工作,我得到"R U Still Down Remember Me]"

但是当我这样做时: names <- gsub("[\\(\\)\\*\\$\\+\\?'\\[\\]]", "", name) 没有任何反应.(即我得到"R U Still Down? [Remember Me]")

有任何想法吗?我试过切换事情的顺序,等等.但我似乎无法弄明白.

regex r gsub

9
推荐指数
2
解决办法
1380
查看次数

使用gsub删除R中第一个空格之前的所有字符串

我有一个这样的数据框:

name         weight
r apple         0.5
y pear          0.4
y cherry        0.1
g watermelon    5.0
pp grape        0.5
y apple pear    0.4
...  ...
Run Code Online (Sandbox Code Playgroud)

我想删除名称列中第一个空格之前的所有字符.谁有人帮我一个忙?谢谢!

regex r gsub

9
推荐指数
2
解决办法
8138
查看次数

用多个元素替换向量中的一个元素

我有一个向量,我想用多个元素替换一个元素,我可以用一个而不是多个替换,任何人都可以帮忙吗?

比如我有

data <- c('a', 'x', 'd')
> data
[1] "a" "x" "d"
Run Code Online (Sandbox Code Playgroud)

我想,以取代"x""b", "c"获得

[1] "a" "b" "c" "d"
Run Code Online (Sandbox Code Playgroud)

然而

gsub('x', c('b', 'c'), data)
Run Code Online (Sandbox Code Playgroud)

给我

[1] "a" "b" "d"
Warning message:
In gsub("x", c("b", "c"), data) :
  argument 'replacement' has length > 1 and only the first element will 
be used
Run Code Online (Sandbox Code Playgroud)

replace r gsub

9
推荐指数
1
解决办法
686
查看次数

使用gsub和awk从特定列中删除点(.)

我想仅从表格的第4和第5列中删除点(.).

input
1    10057   .       A       AC      
1    10146   .       AC.      A       
1    10177   .       A       AC      
1    10230   .       AC      .A,AN    
1    10349   .       CCCTA   C,CCCTAA.              
1    10389   .       .AC      A,AN



desired output
1    10057   .       A       AC      
1    10146   .       AC      A       
1    10177   .       A       AC      
1    10230   .       AC      A,AN    
1    10349   .       CCCTA   C,CCCTAA              
1    10389   .       AC      A,AN    
Run Code Online (Sandbox Code Playgroud)

所以我尝试了以下命令.

awk 'BEGIN {OFS=FS="\t"} {gsub("\.","",$4);gsub("\.","",$5)}1' input
Run Code Online (Sandbox Code Playgroud)

我得到了这个结果(整个第4和第5列被删除了).

1    10057   .          
1    10146   .            
1    10177   . …
Run Code Online (Sandbox Code Playgroud)

unix awk gsub

8
推荐指数
1
解决办法
7898
查看次数

如何用R中的相同替换多个字符串

我有一个字符串

vec = c('blue','red','flower','bee')
Run Code Online (Sandbox Code Playgroud)

我希望将不同的字符串转换为相同的一行而不是单独的,即我可以gsub blue和gsub red使它们都拼写为'color'.我怎么能在一行中做到这一点?

输出应该是:'颜色','颜色','花','蜜蜂'

string replace r gsub

8
推荐指数
1
解决办法
8318
查看次数

标签 统计

gsub ×10

regex ×6

r ×5

ruby ×4

replace ×2

ruby-on-rails ×2

string ×2

awk ×1

escaping ×1

rspec ×1

ruby-1.9 ×1

unix ×1