我有一个字符串:
string = "roll:34 name:joshi ikera"
我想通过分隔:
以及roll值和name键之间的空格来拆分此字符串。输出应如下所示:
[roll, 34, name, joshi ikera]
我尝试使用:
string.split(/:|\d\s/)
但我得到的输出是:
[roll, 3, name, joshi ikera]
如何包含缺失的数字,并在数字后用空格分割?
答案 0 :(得分:1)
\d\s
匹配并使用空格前的数字,Regexp#split()
方法删除使用的文本。在这种情况下,您需要使用一个环视,即后视,使其成为非消费模式部分/:|(?<=\d)\s/
(请参阅valtlai's comment)。但是,在这种情况下,一种更常见的方法是匹配1个或多个空格字符,后面跟着1个字字符(如果键只能包含数字,字母和下划线),后跟:
(参见Sagar's comment })。
我建议
s.split(/\s+(?=\w+:)|:/)
# => roll
34
name
joshi ikera
在这里,
\s+
- 消耗1个以上的空白字符(?=\w+:)
- 后面跟着1个字的字符和:
|
- 或:
- 匹配并使用:
。或者,如果键是唯一的
s.scan(/(\w+):(.*?)(?=\w+:|\z)/).to_h
# => {"roll"=>"34 ", "name"=>"joshi ikera"}
下面,
(\w+)
- 将1个或多个字词字符捕获到第1组:
- 匹配冒号(.*?)
- 除了换行符之外的任何0 +字符都会被捕获到第2组中,如果紧接着(?=\w+:|\z)
- 1个字母字符,然后是:
(\w+:
)或(|
)字符串结尾(\z
)。