Regex, чтобы соответствовать трубы не в скобках или скобках - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь разобрать какую-то вики-разметку. Например, следующее:

{{Infobox 
| person
| name = Joe
| title = Ruler
| location = [[United States|USA]] | height = {{convert|12|m|abbr=on}}
| note = <ref>{{cite book|title= Some Book}}</ref>  
}}

может быть текстом для начала. Сначала я удаляю начальный {{ и окончательный }}, чтобы я мог предположить, что они пропали.

Я хочу сделать .split(<regex>) для строки, чтобы разделить строку на все | символов, которые не находятся в скобках или скобках. Регулярное выражение должно игнорировать символы | в [[United States|USA]], {{convert|12|m|abbr=on}} и {{cite book|title= Some Book}}. Ожидаемый результат:

[
 'person'
 'name = Joe', 
 'title = Ruler', 
 'location = [[United States|USA]]',
 'height = {{convert|12|m|abbr=on}}',
 'note = <ref>{{cite book|title= Some Book}}</ref>'
]

В любой точке могут быть разрывы строк, поэтому я не могу просто искать \n|. Если в нем есть лишние пробелы, это нормально. Я могу легко лишить \s* или \n*.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Вы можете разделить на:

\s*\|\s*(?![^{\[]*[]}])

Разбивка:

  • \s*\|\s* Сопоставить трубу с любыми начальными или конечными пробелами
  • (?! Начало негативного взгляда
    • [^{\[]* Совпадение с чем угодно, кроме { и [ в максимально возможной степени
    • []}] До закрытия ] или }
  • ) Конец негативного взгляда

Негативный прогноз утверждает, что мы не должны достигать } или ] без сопоставления с открывающей парой.

См. демо здесь

0 голосов
/ 30 октября 2018

Я буквально украл регулярное выражение из @ WiktorStribiżew, но это должно работать для вашей входной строки

regex = (/\w+(?:\s*=\s*(?:\[\[[^\]\[]*]]|{{[^{}]*}}|[^|{\[])*)?/)
arr = str.scan(regex).map{|l| l.strip.delete("\n")}[1..-1]

arr теперь запрашиваемый массив.

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