Разделить регулярным выражением на первый равный символ в строке - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть такая строка:

en.HelpPanel.Subtitle1=About
en.HelpPanel.SubText1a=Blah <a href="asdf">

Я хочу разделить по первой = в строке.Я хочу получить результат:

['en.HelpPanel.Subtitle1', 'About', 'en.HelpPanel.SubText1a', 'Blah <a href="asdf">']

Однако у меня возникают проблемы при определении только первого =.Я пробовал это:

Я пытаюсь определить «равный символ, которому не предшествует другой равный символ», я пробовал это:

str.split(/^.*?=/)

Но это дает:

Array [ "", "About\nen.HelpPanel.SubText1a=Blah <a href=\"asdf\">" ]

Я попробовал многострочный флаг, и он дал мне это:

str.split(/^.*?=/m)


Array(3) [ "", "About\n", "Blah <a href=\"asdf\">" ]

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

Вы можете разделить либо на новую строку, либо на знак равенства, за которым не следует содержимое между двойными кавычками с использованием отрицательного взгляда (?!:

str.split(/=(?!"[^"]+")|\n

let str = `en.HelpPanel.Subtitle1=About
en.HelpPanel.SubText1a=Blah <a href="asdf">`;
console.log(str.split(/=(?!"[^"]+")|\n/));
0 голосов
/ 28 ноября 2018

Вы можете использовать это регулярное выражение в .match:

/^([^=]*)=(.*)/gm

И захватывать текст из захваченной группы № 1 и № 2.

RegEx Demo

Код:

const regex = /^([^=]*)=(.*)/gm;
const str = `en.HelpPanel.Subtitle1=About
en.HelpPanel.SubText1a=Blah <a href="asdf">`;
let m;
let result = [];

while ((m = regex.exec(str)) !== null) { 
    result.push(m[1], m[2]);  
}

console.log(result);
/*
[
  "en.HelpPanel.Subtitle1",
  "About",
  "en.HelpPanel.SubText1a",
  "Blah <a href=\"asdf\">"
]
*/
0 голосов
/ 28 ноября 2018

Вы также можете использовать split и Array.flatMap для достижения этой цели.

Обратите внимание - flatMap на данный момент поддерживается не всеми браузерами (например, Edge)

let str = `en.HelpPanel.Subtitle1=About 
en.HelpPanel.SubText1a=Blah <a href="asdf">`

console.log(str.split(/\n/).flatMap(d => ([a, ...b] = d.trim().split('='), [a, b.join('=')])))
0 голосов
/ 28 ноября 2018

Если вы хотите использовать регулярные выражения, вы можете использовать match вместо split:

str.match(/^.*?(?==)|[^=\n\r].*$/gm);

const str = `en.HelpPanel.Subtitle1=About
en.HelpPanel.SubText1a=Blah <a href="asdf">`

const result = str.match(/^.*?(?==)|[^=\n\r].*$/gm);

console.log(result);

С помощью split вы можете сделать это следующим образом:

str.split(/=(.*)[\r\n]*/gm);

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

const str = `en.HelpPanel.Subtitle1=About
en.HelpPanel.SubText1a=Blah <a href="asdf">`

const result = str.split(/=(.*)[\r\n]*/gm);
result.pop(); // get rid of trailing empty string

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