Javascript正規マッチングにはサブストリングは含まれません
2898 ワード
問題の再現
皆さんは
webpack
の使用中に、次のような問題に遭遇したことがありますか.css Module
を使用した場合、同時にいくつかのglobal
のレイアウトを使用することを望んでいるが、実際にはcss Module
で直接:global(.title) {
color: green;
}
実装も可能であるが、
Animate.css
のようなサードパーティcssを導入する必要がある場合、各classname
に対して手動でグローバル定義を行う場合、ワークロードは小さくない.css
のパッケージングの問題については、一部のコンポーネントのスタイルについては、css
をjs
ファイルにパッケージングすることができるが、一部のグローバルなcss
や、最初の時間にロードする必要があるcss
(例えばpace.css
は、ページロード中に最初の時間でスタイルを解析する必要がある)があり、ExtractTextPlugin
を使用して単独のcss
ファイルにパッケージングする必要がある.以上は、同じタイプのファイルに対する異なる処理が必要である.
webpack
では、正規表現でファイル名マッチングを行うように表現されている.より優雅なネーミングのために、第1のシナリオを例に挙げると、グローバルなスタイルファイルを
foo.global.less
と命名し、他のcss module
処理が必要な場合は、bar.less
のように正常にネーミングします.構想
トピックに入る前に、
Javascript
だけでなく、*.global.less
の正則を含む実用的なオンライン正則サイトrefiddleを共有します.次のメインイベントは、
*.less
と*.global.less
をどのように正則的にマッチングしますか?よく知られているように、
webpack
には複数回の正規一致は存在しないため、上記の2つの文字列の一致を解決するためにそれぞれ2つの正規表現を使用する必要がある.*.global.less
文字列マッチング?はい、so easy,/\.global\.less$/
,では*.less
(*.global.less
を含まない)は?明らかに、これは正則的な位置マッチング(
(^\.global)
および[^\.global]
が正しくない)を使用する必要があり、マッチングの前に.global
の位置ではない.ぶんかつ
構文
説明
キャプチャ
(exp)
expに一致し、自動的に命名されたグループにテキストをキャプチャします.
キャプチャ
(?exp)
expに一致し、名前がnameのグループにテキストをキャプチャし、(?'name'exp)と書くこともできます.
キャプチャ
(?:exp)
一致exp、一致するテキストを取得せず、このパケットにグループ番号を割り当てない
位置照合
(?=exp)
expの前の位置に一致
位置照合
(?<=exp)
expの後ろの位置に一致
位置照合
(?!exp)
後ろに付いているexpではない位置に一致します
位置照合
(?
前のexpでない位置に一致
コメント
(?#comment)
このタイプのグループ化は、正規表現の処理に影響を及ぼさず、注釈を提供して読ませるために使用されます.
上記の表のように、
(?, /(?, !
を する があることは らかです.
でも! にこれでいいの?? ながらjsでは(?<=exp)
と(? 。( Js , , , ? )
RegExp.
は していません
と の を て、Jsにはある が まれていない マッチング/^(.(?!\.global))+\.less$/
が られた.(?!\.global)
するのは ろが.global
ではない (.(?!\.global))+
するのはいくつかの ろが.global
ではない ^
ではない の の を うことはできません!もしなくなったら、/(.(?!\.global))+\.less$/
もfoo.global.less
に することができます.foo
の ろの.
から、 ろについているのは.global
ではありませんから.
しかし、.global.less
については、この もどうしようもない.
リファレンス
30 チュートリアル JavaScript RegExp は「ある を まない」( かりやすく もある!)