Ваше регулярное выражение /^[^\\]+/
пытается сопоставить один или несколько символов в начале строки, которые не являются обратными слешами.Символ обратной косой черты (ASCII 92) пишется 92.chr #=> "\\"
, тогда как символ перевода строки (ASCII 13) пишется 13.chr #=> "\r"
. 1
Поэтому вы хотите /\A[^\r]+/
.
Обратите внимание, что я использовал начало строки якорь, \A
, а не начало строки якорь, ^
.Примите во внимание следующее.
"\r\ndog \r".match(/\A[^\r]+/) #=> nil
"\r\ndog \r".match(/^[^\r]+/) #=> #<MatchData "dog ">
Использование \A
или ^
зависит от того, чего вы хотите достичь.Впредь я буду считать, что вы хотите \A
.(Однако вы должны прояснить это, отредактировав вопрос. Как написано, искомая подстрока не обязательно должна начинаться с начала строки или строки.)
Продолжение,
r = /\A[^\r]+/
m = s.match(r) #=> #<MatchData "Shadowborn Apostle ">
m[0] #=> "Shadowborn Apostle "
или (вместо m[0]
):
$& #=> "Shadowborn Apostle "
или просто:
s[r] #=> "Shadowborn Apostle "
См. MatchData # [] и String # [] .
Если конечный пробел не является обязательным, это нормально.Однако, если строка должна оканчиваться пробелом, мы должны внести небольшую корректировку в регулярное выражение:
r = /\A[^\r]+ /
Наконец, вот еще один способ получить желаемую подстроку, которая делаетне использовать регулярные выражения:
idx = s.index(" \r")
#=> 18
idx.nil? ? nil : s[0, idx+1]
#=> "Shadowborn Apostle "
idx = "How now, brown cow".index(" \r")
#=> nil
idx.nil? ? nil : s[0,idx+1]
#=> nil
См. Строка # index .
1 Почему бы не один обратный слеш (/^[^\]+/
)?Поскольку Ruby запускает класс символов ("["
), прочитайте 'negate' ("^"
), экранированную правую скобку "\]"
(интерпретируется как символ "]"
) и "+"
.Поскольку следующий символ, "/"
, завершает регулярное выражение, она заключит, что класс символов не был закрыт, и, следовательно, вызовет исключение (SyntaxError
).