Невозможно извлечь подстроку из строки с помощью регулярного выражения - PullRequest
0 голосов
/ 26 мая 2018

Мой первый пост здесь, и он "очевидно" должен быть о регулярном выражении (кошмар всех начинающих разработчиков)

У меня есть строка: s = "Shadowborn Apostle \r\nCreature — Human Cleric \r\nA deck can have any number Of \r\ncards named Shadowborn Apostle. \r\ne, Sacrifice six creatures named \r\nShadowborn Apostle: Search your \r\nlibrary for a Demon creature card \r\nand put it onto the battlefield. Then \r\nshuffle your library. \r\n"

Я хотел бы извлечьтолько эта часть Shadowborn Apostle(space)

Я использую .match, чтобы получить нужную подстроку: s.match(/^[^\\]+/)

К сожалению, MatchData = вся строка.И я не уверен почему.Любая помощь будет оценена.

Спасибо!

Ответы [ 2 ]

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

Ваше регулярное выражение /^[^\\]+/ пытается сопоставить один или несколько символов в начале строки, которые не являются обратными слешами.Символ обратной косой черты (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).

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

Ваше регулярное выражение ^[^\\]+ совпадает с начала строки, пока не встретит первую обратную косую черту, включая пробел, потому что отрицательный класс символов не совпадает с обратной косой чертой один или несколько раз.

Возможно, вы можете сопоставить любой символ один или несколько раз, не жадный .+? и использовать положительный lookahead ^.+?(?= \\r)

Демо

Если вы хотите сопоставить Shadowborn Apostle с последующим пробелом в тексте, вы также можете использовать границу слова \b в начале, чтобы убедиться, что она не является частью более длинного совпадения.и используйте положительный прогноз в конце (?= ), чтобы утверждать, что ниже следует пробел.

\bShadowborn Apostle(?= )

Демо

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