Замена строки регулярного выражения Javascript многострочных строк

С заменой регулярного выражения JavaScript, пытаясь заменить что-либо между тегами <head> и </head>, чтобы:

<head>
   Multiline foo
</head>
<body>
  Multi line bar
</body>

заменяется на:

<body>
  Multi line bar
</body>

и пробовать с самым простым: <head(.*)\/head>/m, который не работает. Он отлично работает, когда из строки удаляются разрывы строк. Независимо от того, какой тип разрыва строки, в чем магия?


person Rushen Bilgin    schedule 19.01.2011    source источник
comment
см. blog.stevenlevithan.com/archives/singleline-multiline-confusing   -  person endolith    schedule 07.06.2012


Ответы (2)


Проблема в том, что метасимвол точки не соответствует символу новой строки. В большинстве разновидностей регулярных выражений вы можете заставить его соответствовать всем, установив режим «DOTALL» или «однострочный», но JavaScript не поддерживает это. Вместо этого вам нужно заменить точку чем-то, что действительно соответствует всему. Наиболее распространенной идиомой является [\s\S] ("любой пробельный символ или любой символ, который не является пробельным").

person Alan Moore    schedule 19.01.2011
comment
У вас также есть [\d\D] и [\w\W]! :D - person Thai; 19.01.2011

Алан прав, резюмируя, используйте /<head([\s\S]*)\/head>/, и он должен делать то, что вы хотите.

Фактическое регулярное выражение, которое я бы использовал для задания, - /<head>([\s\S]*?)<\/head>/, но разница, вероятно, не будет иметь значения, поскольку оно просто гарантирует отсутствие жадного сопоставления со вторым тегом заголовка, которого никогда не должно быть :)

person Martin Jespersen    schedule 19.01.2011