0

coffee-scriptプロジェクトで使用するかなり重い正規表現を作成しました。これは、ユーザーテキスト(メッセージ、投稿、散文)の大きな塊を取り、そこにあるすべての潜在的なURLを見つけ、可能な限り貪欲にすることを目的としています。

urlGrabber = ///
  (\s|^)                              # Start after a whitespace or string[0]
  ([a-zA-Z]+\://)?                    # Captures any protocol (just not //)
  (\w+:\w+@)?                         # Username:Password
  ([a-zA-Z\d-]|[a-zA-Z\d-]\.)*        # Subdomains
  [a-zA-Z\d-]{2,}                     # Domain name
  \.                                  # THE DOT
  ([a-zA-Z]{2,4}(:\d+)?)              # Domain Extension with Port
  ([/\?\#][\S/]*)*                    # Some Request, greedy capture
  \b                                  # Last word boundary
  /?                                  # Optional trailing Slash
///g

abc.mno.st.u.xvyどこabs.mno.stが文字列として解析されるかなど、文字列に関する問題が発生しています。これはまったくキャプチャされるべきではありません。キャプチャされるas.ds.d.場所についても同じことが言えます。as.ds

誰かがこれが起こっている理由を説明したり、それを修正するために必要な変更を手伝ったりできますか?

4

1 に答える 1

1

正規表現パターンを使用

(?:\s+|^)                                                   # leading spaces
([a-zA-Z]+://|)                                             # protocol
(\w+:\w+@|)                                                 # username:password@
((?:[a-zA-Z\d]+(?:-[a-zA-Z\d]+)*\.)*)                       # subdomain(s)
([a-zA-Z\d]+(?:[a-zA-Z\d]|-(?=[a-zA-Z\d]))*[a-zA-Z\d])      # domain
(\.[a-zA-Z]{2,4})                                           # .top-level-domain
(:\d+|)                                                     # :port
(/\S*|)                                                     # rest of url
(?!\S)

注:サブドメインおよびドメインは、開始および終了できません。また-、二重も使用しないでください ( IDN ドメイン名のPunnycode--サポートする場合を除きます)。

于 2012-11-15T21:35:21.853 に答える