1

RegEx が実行される文字列が渡され、一致するものを返す JS 関数があります。

searchText= // some string which may or may not contain URLs
Rxp= new RegExp("([a-zA-Z\d]+://)?(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(/.*)?/ig")
return searchText.match(Rxp);

RegExp は、次の (および同様の派生物) のいずれかに一致するものを返す必要があります。

しかし、そのような幸運はありません。助言がありますか?

4

2 に答える 2

3

文字列で\は、エスケープする必要があります: \\.

まず、文字列が解釈されます。重要な意味がないため、 になります\w次に、解析された文字列が RegEx に変換されます。ただし、文字列の解析中に失われるため、正規表現が壊れます。w
\

コンストラクターを使用する代わりに、RegExpRegEx リテラルを使用します。

Rxp = /([a-zA-Z\d]+:\/\/)?(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(\/.*)?/ig;
// Note: I recommend to use a different variable name. Variables starting with a
//  capital usually indicate a constructor, by convention.

入力が文字列であることを 100% 確信できない場合execは、引数を文字列に強制する次のメソッドを使用することをお勧めします。

return Rxp.exec(searchText);

クエリ文字列と URL フラグメントを含むパターンを次に示します。

/([a-zA-Z\d]+:\/\/)?(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(\/[^?#\s]*‌)?(\?[^#\s]*)?(#\S*)?/ig
于 2012-06-29T10:33:20.107 に答える
1

まず、動的なものは何も含まれていないため、RegExp コンストラクターを使用してパターンを作成する必要はありません。/pattern/代わりにリテラルを使用できます。

ただし、コンストラクターを使用する場合は、パターンがリテラル REGEXP ではなく文字列として宣言されていることを覚えておく必要があります。そのため、特殊文字をダブルエスケープする必要があり\\dます\d。また、まったくエスケープしていないスラッシュがいくつかありました。

コンストラクターでは、修飾子 (g, i) が 2 番目の引数として渡され、パターンに追加されません。

したがって、文字通りあなたが持っているものを変更するには、次のようになります。

Rxp= new RegExp("([a-zA-Z\\d]+:\\/\\/)?(\\w+:\\w+@)?([a-zA-Z\\d.-]+\\.[A-Za-z]{2,4})(:\\d+)?(\\/.*)?", "ig")

しかし、より良いでしょう:

Rxp = /([a-zA-Z\d]+:\/\/)?(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(\/.*)?/gi;
于 2012-06-29T10:38:13.290 に答える