0

正規表現で始まるかどうかに関係なく、URL を抽出するために re2/J を使用しています。かなり単純なパターンを使用していますが、

(?i)((https?://)?(([a-z0-9\\-]+[.])*([a-z0-9\\-]+[.][a-z]+/?)([^\\s()<>]*)))

ただし、最初と最後に \b を追加しても、あまり役に立ちません。メールの一部である URL とまだ一致しています。

email@ example.com からのexample.comも一致します。私が避けようとしている何か。@は単語以外の文字と見なされるため、\b はそれを単語の境界として扱います。

この問題に対する適切な代替ソリューションはありますか?

編集:

URL を html アンカー タグに置き換えようとしていることに注意してください。実際に一致を探しているわけではありません。パターンと、キャプチャされたグループの置換を指定する必要があります。

4

2 に答える 2

1

一部の一致を「スキップ」して別の一致を置き換える必要がある場合の通常の「トリック」は、必要なものを一致させてキャプチャし、必要のないものだけを一致させることです。置換パターンは両方のコンテキストで異なるため、一致オブジェクトを分析できるはずであり、次のMatcher#appendReplacement機能を提供します。

 String s = "some@domain.com\ndomain.com\nwww.domain.com\nhttp://www.domain.com\nhttps://www.domain.com";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("(?i)\\S+@\\S+\\.\\S+|((?:https?://)?(?:[a-z0-9-]+[.])*[a-z0-9-]+[.][a-z]+/?[^\\s()<>]*)").matcher(s);
while (m.find()) {
    if (m.group(1) != null) {
        m.appendReplacement(result, "<a href=\"" + m.group(1) + "\">" + m.group(1) + "</a>");
    }
    else {
        m.appendReplacement(result, m.group());
    }
}
m.appendTail(result);
System.out.println(result.toString()); // Demo output

オンライン Java デモ(java.util.regex同じテクニックを使用)

パターン詳細:

  • \\S+@\\S+\\.\\S+- メールに似たものに一致します (1+ 空白以外、@、1+ 空白以外.、再び 1+ 空白以外)
  • |- また
  • ((?:https?://)?(?:[a-z0-9-]+[.])*[a-z0-9-]+[.][a-z]+/?[^\\s() <>]*)- グループ 1 でパターンをキャプチャします。

グループ 1 が一致する場合、それは ではないためnull、タグにラップする必要があります。それ以外の場合は、マッチ全体を再挿入します。

于 2016-12-08T10:49:28.423 に答える
0

email@example.com の場合、regex は単純に e を [^@] として、xample.com を残りの一致として一致させます。これらは後で 1 つの一致にマージされます。URL の前の空白をチェックするだけで、サブパターンには含めないでください。

見てください、これはあなたを助けることができます。preg_match_all はすべての URL を検索しますが、電子メールは除外します

于 2016-12-08T07:42:15.797 に答える