. * неправильно записывает запятые - PullRequest
2 голосов
/ 20 июня 2019

Мое регулярное выражение неправильно обрабатывает запятые в строке.

if line =~ /^.*,(\d{4}-\d{2}-\d{2}),(\d+:\d+),.*,(\d+),.*,(.*) && (.*),Other,Other.*$/

Я читаю файл строка за строкой, которая должна выглядеть следующим образом:

"",2019-06-14,01:30,,27,"",Episode Name && Series Name,Other,Other,LOCAL

Однако, если серияимя содержит запятую, например.«Busy Electron, The», регулярное выражение будет захватывать только «The», а не полное имя.

1 Ответ

1 голос
/ 20 июня 2019

Это может быть выражение, которое мы можем искать здесь, но не правильный метод:

"(.*?)",([0-9]{4}-[0-9]{2}-[0-9]{2})\s*,([0-9]{2}:[0-9]{2}),(.*?),([0-9]+),"(.*?)",(.*?),(.*?),(.*?),(.*)

За исключением последнего поля, мы просто реализовали бы ленивый квантификатор (.*?) для тех полей, которые мы не проверяли бы.

(.*)? не работает, так как это сделает всю группу захвата ленивой, а не .*.

Раньше он доходил до ?, .* уже пролистал нашу строку до конца и собрал все символы, кроме новых строк.

Если мы хотим добавить или уменьшить ограничения, мы можем сделать это, например:

"(.*?)",\s*([0-9]{4}-[0-9]{2}-[0-9]{2})\s*,\s*([0-9]{2}:[0-9]{2})\s*,(.*?),\s*([0-9]+)\s*,"(.*?)",(.*?),(.*?),(.*?),(.*)

Тест

re = /"(.*?)",([0-9]{4}-[0-9]{2}-[0-9]{2})\s*,([0-9]{2}:[0-9]{2}),(.*?),([0-9]+),"(.*?)",(.*?),(.*?),(.*?),(.*)/m
str = '"",2019-06-14,01:30,,27,"",Episode Name && Series Name,Other,Other,LOCAL

"some things we wish here",2019-06-14,01:30,some things we wish here,27,"some things we wish here",Episode Name && Series Name,Other,Other,LOCAL'

# Print the match result
str.scan(re) do |match|
    puts match.to_s
end

Демо

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

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