Regex, JS: сопоставить текст с концом строки после определенного слова без включения слова в соответствие - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь создать регулярное выражение для разбора документа для приложения Node.js. Регулярное выражение, которое я создал, соответствует всему в строке после определенного слова. Однако я не могу выяснить, как исключить конкретное слово из совпадения. Это проблематично, потому что конкретное слово может иметь переменное количество пробелов между собой, что означает, что я не могу использовать взгляд сзади, чтобы исключить слово. Как я могу исключить это слово из моего соответствия?

https://regex101.com/r/kk7Lxe/2

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Регулярное выражение, которое соответствует только links, равно

/^\s*\|links\s*?=\s*(.*)$/m

Это будет фиксировать значение ссылок в группу захвата 1, которую вы можете ссылаться как match[1]. В JavaScript это выглядит так:

const str = `
{{Song box 2
  |color     = black; color:#D7DA5F
  |image     = Kokoropv.jpg
  |title     = "'''ココロ'''"
* Romaji: Kokoro
* Official English: Heart
  |date      = March 2, 2008
  |views     = {{v|nn|2,738,496}}
  |singers   = [[Kagamine Rin]] act1
  |producers = [[Toraboruta-P]] (music, lyrics, illustration)
  |links     = {{l|nn|sm2500648}} {{l|mz|266689|defunct}}
  |links = {{l|nn|sm2500648}} {{l|mz|266689|defunct}}
}}
`
const match = str.match(/^\s*\|links\s*?=\s*(.*)$/m)
const links = match && match[1]
console.log(links)

Расширенное решение

Лично я бы сделал более общее решение, которое анализирует этот список в объект и позволяет вам легко ссылаться на все ключи и значения по мере необходимости:

const getKeywordValuePairs = str => {
    const pattern = /^\s*\|(.*?)\s*?=\s*(.*)$/gm
    const result = {}
    let match
    while(match = pattern.exec(str)) {
      const [unused, key, value] = match
      result[key] = value
    }
    return result
}

const result = getKeywordValuePairs(`
{{Song box 2
  |color     = black; color:#D7DA5F
  |image     = Kokoropv.jpg
  |title     = "'''ココロ'''"
* Romaji: Kokoro
* Official English: Heart
  |date      = March 2, 2008
  |views     = {{v|nn|2,738,496}}
  |singers   = [[Kagamine Rin]] act1
  |producers = [[Toraboruta-P]] (music, lyrics, illustration)
  |links     = {{l|nn|sm2500648}} {{l|mz|266689|defunct}}
  |links = {{l|nn|sm2500648}} {{l|mz|266689|defunct}}
}}
`)

console.log(result)
console.log(result.links)
0 голосов
/ 07 ноября 2019

Вы можете сделать что-то вроде этого, где вы сопоставляете каждую строку, которую хотите, а затем удаляете ненужную часть с помощью String # match и String # replace (также Array # map для преобразования каждой строки, с которой вы ранее совпали)

Я изначально пытался использовать reg.exec(data), но это соответствует только первое решение , которое вы хотите

const data = `{{Song box 2
  |color     = black; color:#D7DA5F
  |image     = Kokoropv.jpg
  |title     = "'''ココロ'''"
* Romaji: Kokoro
* Official English: Heart
  |date      = March 2, 2008
  |views     = {{v|nn|2,738,496}}
  |singers   = [[Kagamine Rin]] act1
  |producers = [[Toraboruta-P]] (music, lyrics, illustration)
  |links     = {{aaal|nn|sm2500648}} {{l|mz|266689|defunct}}
  |links = {{l|nn|sm2500648}} {{l|mz|266689|defunct}}
}}`;

const reg = /\|links\s*=\s*[^\n]+/g

// destructuring same as
// reg.exec(data)[1]
const res = (data
   .match(reg)||[])
   .map(row=>row.replace(/\|links\s*=\s*/g, ""));

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