2017-12-10 17 views
0

私は電子メールアドレスを見つけると予想されるnodeJSサーバで作業しており、正規表現を使用する必要があります。NodeJSの正規表現パターンが期待したものと一致しない

/[A-Z0-9.][email protected][A-Z0-9.-]+\.[A-Z]{2,}([A-Z]{2,})?/i 

を、私はそれは、例えば、電子メールに一致するように期待している:

私は、次のパターンを使用しています。これは、ちょうど匿名化された、掻き集められたウェブサイトからの実際のスニペットです。これを行うには

 <a href="mailto:[email protected]">[email protected]</a> 

、私はそうのような組み込みString.match()機能を使用しています:

let expr = /[A-Z0-9.][email protected][A-Z0-9.-]+\.[A-Z]{2,}([A-Z]{2,})?/i 
let str = "<a href="mailto:[email protected]">[email protected]</a>" 
console.log(str.match(expr)); 

私は出力が一致の配列であることを期待し、代わりにnullを取得しています。サーバでstrCheerioで刻んだウェブページの完全なHTMLで、toString()に変換されています。それはin this Regexr exampleを作成しました。

ご迷惑をおかけして申し訳ございません。私は私の独創的なアプローチが機能しなかった理由はわからない

ソリューション

。最後に、RegExpオブジェクトを作成すると、そのように私のために働い:

let expression = "[A-Z0-9.][email protected][A-Z0-9.-]+\.[A-Z]{2,}([A-Z]{2,})?" 
let regexp = new RegExp(expression, 'ig'); 
let results = bodyText.match(regexp); 

しかし、私はそれが最初のオブジェクトを作成しなくても機能するように得ることができませんでした。

+0

に見てみましょう結果。いずれにせよ、 '.'にマッチさせるには、文字クラスの外でそれをエスケープする必要があります(' + 'の後の' .'はエスケープする必要があります)。 –

+0

これは役立つかどうか分かりませんが、Rubyで提供した正規表現を試してみました。最後から 'g'を削除して、最初の部分の前後に括弧を入れてみました。http:// rubular。 – evanrelf

+0

@WiktorStribiżew私は実際にそれをエスケープしていますが、私のポストに反映されませんでした。私はそれを更新します。 @evanrelf提案していただきありがとうございます。私は旗で遊んだが、まだ「ヌル」に終わっている。 –

答えて

0

let expr = /[A-Z0-9.][email protected][A-Z0-9.-]+\.[A-Z]{2,}([A-Z]{2,})?/ig 
let str = "<a href="mailto:[email protected]">[email protected]</a>" 
console.log(str.match(expr)); 

正規表現フラグあなたの正規表現の末尾にgを追加

g グローバルマッチ。すべてのマッチを見つけるのではなくケース
m 複数行を無視 i
最初の試合後に停止します。 の開始または終了だけでなく、入力文字列全体(\ nまたは\ rで区切られた各 行の先頭または末尾に一致する)として開始および終了文字(^および$)を扱います)
u unicode;パターンをユニコードコードポイントのシーケンスとして扱う
y sticky;ターゲット文字列のこの正規表現のlastIndexプロパティで指定されたインデックスからのみ一致します( 以降のインデックスからの一致を試みません)。あなたは `正しく、あなたが得るstr`` [ "[email protected]"、 "[email protected]"] `として定義した場合

MDN

関連する問題