这是我的正则。
\<body\>([\s\S].*?)\<\/body\>
str是我要查找的字符串。假如我去掉字符串里面的换行,正则可以匹配到东西,但是如果不加这个代码,正则就匹配不到。
str = str.replace(/\n/g, "");
谁能解释一下?如何解决这个问题?
----------补充-----------
后来换成
\<body\>([\s\S]*?)\<\/body\>
这样就行了。
.*?和*?的区别在哪呢?
PHP中文网2017-04-17 15:36:52
body タグ内のすべてのコンテンツを取得したいことを理解してください
以下の正規表現
リーリー正しく一致しないのは、記述が間違っているためです。
この式の重要な部分を分解します
リーリー[sS] は、空白文字または空白文字以外の文字と一致します。つまり、改行、スペース、タブを含むすべての文字と一致しますが、
は 1 つだけと一致します。.* とはどういう意味ですか?
。改行文字を除く任意の文字
と一致することを示します。.* は、0 個以上の任意の文字 (改行を除く) と一致することを意味し、常に可能な限り多くの文字と一致します。
ここで *
を変更するために使用されます。 *?
を追加すると、遅延マッチングを意味します。できるだけ少ない文字を一致させてください。 0 以上のうち最も小さいものはどれですか?もちろん 0 があるので、.*?
は何も一致しません。
式全体
リーリー は、<body>
と </body>
の間にある文字または空白を 1 つだけ含むコンテンツに一致します。そして
の一致内容は同じです。つまり、.*?
は効果がありません。
.
を削除するだけで問題ないのはなぜですか? .
を削除した後、*?
の遅延マッチングが
部分。0 個以上の空白文字または空白以外の文字を示します。
あなたは
だと思います リーリー は改行と一致するために使用されると理解されており、.
を追加するとすべてのコンテンツと一致することができます。実際、あなたの理解によれば、次のように書く必要があります
もこの方法で一致させることができますが、.
であるため、ここでの
は、.
に一致するコンテンツを含む任意のコンテンツに一致します。
つまり、最終的な答えは
リーリー は、<body>
と </body>
の間の 0 個以上の文字と一致します。したがって、コンテンツを正しく照合できます。
それだけです。
PS: SegmentFault エディターではエスケープ文字が使いにくいため、レイアウトが少し乱雑です