2011-01-19 3 views
4

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

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

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

<body> 
    Multi line bar 
</body> 

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

+0

см http://blog.stevenlevithan.com/archives/singleline-multiline-confusing – endolith

ответ

8

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

+1

У вас также есть '[\ d \ D]' и '[\ w \ W]'! : D – Thai

4

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

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