LINUX.ORG.RU

Логика работы регулярки.

 , ,


0

1

//содержимое исходного файла tmp:
////////////////////////////////////////////
//foo=function(){foobar}
//foo=function(){foobar} foo=function(){foobar}
/////////////////////////////////////////////

s=fs.readFileSync("tmp", "ascii") // читаем

s=s.replace(/({)(.*?)(})/mg, "$1\n   $2\n$3\n") // форматируем

// вывод
//  foo=function(){
//     foobar
//  }
//  
//  foo=function(){
//     foobar
//  }
//   foo=function(){
//     foobar
//  }

//теперь удаляем пустые строки:
s=s.replace(/^\s+?/mg, "") // эта регулярка работает, написал чуть ли не методом тыка 

//вывод
//  foo=function(){
//    foobar
//  }
//  foo=function(){
//    foobar
//  }
//  foo=function(){
//    foobar
//  }


//s=s.replace(/^\s+?$/mg, "") //  а эта нет. Почему?

Почему, если указываем конец пустой строки, регулярка не работает? А так, че-то непонятно, что я написал, боюсь сюрпризов.



Последнее исправление: J-yes-sir (всего исправлений: 3)

Потому что у тебя весь файл читается в одну строку. Тебе нужен флаг для многострочных регулярок.

vurdalak ★★★★★
()
Ответ на: комментарий от vurdalak

Вы про какое выражение про второе? там есть флаг m.

J-yes-sir
() автор топика

Почему, если указываем конец пустой строки, регулярка не работает?

+? отключает жадность, $ матчит позицию перед переводом строки. В результате весь регексп матчит промежуток между двумя переводами строк. Тебе же надо матчить что-то вроде /^\s*\n/gm

kim-roader ★★
()
Ответ на: комментарий от kim-roader

Да, я хотел написать

/^(\s+)?/gm
это эквивалентно
/^\s*/gm
, по-моему. Просто скобки забыл поставить. А ваше выражение работает, да, и объяснили понятно, спасибо.

J-yes-sir
() автор топика
Ответ на: комментарий от kim-roader

Кстати, я осознал, кажется, почему работает

s="foo\n   \n\nbar\n  \nbaz"

w(s.match(/^\s*/gm))

//  [ '', '   \n\n', '', '  \n', '' ]

w(s.replace(/^\s*/gm, ""))

//  foo
//  bar
//  baz
Потому что, символ перевода строки тоже подпадает под метасимвол \s. Поэтому так тоже можно удалять, в принципе:) Еще раз спасибо.

J-yes-sir
() автор топика

Привет, анонімус

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.