Как сделать функцию, которая может анализировать чувствительные к пространству строки в javascript? - PullRequest
1 голос
/ 20 января 2020

У меня есть строка str , определенная как:

const str = `
 @get body {
     Anything here.....
     Any no. of lines

     Or, empty lines as above
 }
`

Я создал функцию get () , которая по имени получает элемент, @ get помечает, и да содержимое между { & } . Можно использовать что-то вроде этого:

console.log(get(str))
// body
/*  
     Anything here.....
     Any no. of lines

     Or, empty lines as above
*/

Итак, источник моей функции (у меня нет большого опыта использования match () , поэтому я обычно использую replace () для получения значения, а также замены на что-либо, если и только если мне потребуется, поэтому, пожалуйста, не стесняйтесь редактировать мой код):

const get = (val) => {
  val.replace(/@get(.*?)\{([\S\s]*?)\}/gm, (_, a, b) => {
    console.log(a)
    console.log(b)
   }
}

Итак, теперь мой вопрос в том, что если я уберу скобки то есть { & } ? Предполагаемый синтаксис:

const str = `
 @get body 
    Anything here.....
    Any no. of lines

    Or, empty lines as above
 Don't catch me !
`
console.log(get(str))

Теперь вывод остается прежним. Как я могу сделать мой get () функциональным пространством чувствительным. Вы можете видеть, что предложение «Не поймай меня!» , тоже самое нет. пробелов перед ним, начиная с @ get , поэтому он анализируется как внешнее содержимое и не указывается как содержимое блока @ get body , следовательно, не отображается. Итак, я думаю, как это сделать? Это возможно в javascript?

Ответы [ 2 ]

1 голос
/ 20 января 2020

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

const str = `
 @get body
    Anything here.....
    Any no. of lines

    Or, empty lines as above
 Don't catch me !
`;

function get(str) {
    let [,,name, content] = (str.match(/^([ ]*)@get\s*(.*\S).*((?:[\r\n]+^\1[ ].*)*)/m) || []);
    content = content.trim().replace(/^[ ]+/gm, ""); // remove leading spaces from all lines
    return [name, content];
}

console.log(get(str));

Для этого необходимо, чтобы содержимое состояло из строк, которые имеют как минимум на один пробел больше, чем строка @get (или являются пустыми).

0 голосов
/ 20 января 2020

Слишком поздно на сцене.
Но вот похожая функция, которая использует совпадение.

 const str = `
 @get body 
    Anything here.....
    Any no. of lines

    Or, empty lines as above
 Do not catch me
 `
 
 const get = (str) => {
     let arr = str.match(/@get\s+(\S+)\s*[\r\n]+(\s+)(.*[\r\n]+(?:\2.*[\r\n]+|\s*[\r\n]+)*)/);
     let res = { 
 	     title: arr[1], 
 	     indentation: arr[2],
 	     content: arr[3]
     };   
    console.log(res.title, res.content);
 };
 
get(str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...