如何分割角色并保持价值

时间:2018-05-21 18:20:24

标签: ruby string

我有一个字符串:

" N8383"

我想分割角色并保持它得到:

["N", "8383"]

我尝试了以下内容:

"N8383".split(/[A-Z]/)

给了我:

["", "8383"]

我想匹配更多示例字符串,如:

N344 344N S555 555S

3 个答案:

答案 0 :(得分:4)

由于其他人所说的原因,

<input type="number" min="2" max="50" pattern="[0-9]*"> 不适合这个问题。我会这样做,使用String#scan代替:

String#split

如果字符串包含多个字符串部分和/或多个数字部分,这将为您提供一些工作。

这个表达式:

str_parts = "N8383".scan(/[[:alpha:]]+/)
num_parts = "N8383".scan(/[[:digit:]]+/)

将返回:

%w[N344 344N S555 555S].map do |str|
  next str.scan(/[[:alpha:]]+/), str.scan(/[[:digit:]]+/)
end 

虽然你要扫描每个字符串两次,但我认为这是一个比1更好的解决方案。试图想出一个复杂的正则表达式,回溯以正确的顺序返回部分,或者2.重新处理结果以将部分放入正确的顺序。特别是如果字符串与您提供的示例中的字符串一样短。话虽如此,如果扫描每个字符串两次真的让你感到沮丧,这是另一种方法:

[
  [["N"], ["344"]],
  [["N"], ["344"]],
  [["S"], ["555"]],
  [["S"], ["555"]]
]

答案 1 :(得分:3)

好的,给出了示例,您可以使用以下正则表达式

   /(?=[A-Z])|(?<=[A-Z])/

对于单个字符?=,我们会向前看([A-Z])或向后看(?<=)以查找单个字符[A-Z]。由于这些是零长度断言,因此拆分放在字符之间而不是字符。 e.g。

  %w{N8383 N344 344N S555 555S}.map {|s| s.split(/(?=[A-Z])|(?<=[A-Z])/) } 
  #=> [["N", "8383"], ["N", "344"], ["344", "N"], ["S", "555"], ["555", "S"]]

然而,这个正则表达式特定于给定的情况并且不提供与给定情况的任何实际偏差,例如我不知道“N344S”的期望输出,但是现在它将是["N", "344" ,"S"]并且更糟糕{ {1}}将"NSS344S"

答案 2 :(得分:2)

def doit(str)
 str.scan(/\d+|\p{L}+/)
end

doit "N123"   #=> ["N", "123"]
doit "123N"   #=> ["123", "N"]
doit "N123M"  #=> ["N", "123", "M"]
doit "N12M3P" #=> ["N", "12", "M", "3", "P"]
doit "123"    #=> ["123"]
doit "NMN"    #=> ["NMN"]
doit ""       #=> []