Как разделить на персонажа и сохранить ценность - PullRequest
0 голосов
/ 21 мая 2018

У меня есть строка:

"N8383"

Я хочу разделить символ и сохранить его, чтобы получить:

["N", "8383"]

Я попробовал следующее:

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

, что дает мне:

["", "8383"]

Я хочу сопоставить еще несколько примеров строк, таких как:

N344 344N S555 555S

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

String#split плохо подходит для этой проблемы по причинам, указанным другими.Я бы подошел к этому так, используя вместо этого String#scan:

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 

Вернет:

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

Хотя вы сканируете каждую строку дважды, я думаю, что это лучшее решение, чем 1. пытаться прийтисо сложным регулярным выражением, которое возвращает обратно, чтобы вернуть детали в правильном порядке, или 2. обрабатывает результаты, чтобы расположить детали в правильном порядке.Особенно, если строки такие короткие, как в приведенных вами примерах.При этом, если сканирование каждой строки дважды действительно раздражает вас, вот еще один способ сделать это:

str_parts, num_parts = str.scan(/([[:alpha:]]+)|([[:digit:]]+)/).transpose.each(&:compact!)
0 голосов
/ 21 мая 2018
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 ""       #=> []
0 голосов
/ 21 мая 2018

Хорошо, учитывая примеры, вы можете использовать следующее регулярное выражение

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

Это будет смотреть вперед (?=) для одного символа [A-Z] или смотреть (?<=) для одногосимвол [A-Z].Поскольку это утверждения нулевой длины, разделение делается между символами, а не символом.например,

  %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"] и еще хуже "NSS344S" будет ["N", "S", "S", "344", "S"]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...