2

正規表現は初めてです。正規表現を使用してpostgreSQLjdbcURLからホスト名を取得したいと思います。

postgreSQLのURLが。になると仮定しますjdbc:postgresql://production:5432/dbname。ホスト名である「本番」を取得する必要があります。Java分割関数ではなく正規表現で試してみたい。で試してみました

Pattern PortFinderPattern = Pattern.compile("[//](.*):*");
final Matcher match = PortFinderPattern.matcher(url);
if (match.find()) {
    System.out.println(match.group(1));
}

ただし、ホスト名から最後までのすべての文字列と一致します。

4

5 に答える 5

1
Pattern PortFinderPattern = Pattern.compile(".*:\/\/([^:]+).*");
于 2013-02-15T13:02:47.553 に答える
1

グループ化なしの正規表現:

"(?<=//)[^:]*"
于 2013-02-15T13:07:06.367 に答える
0
[//]([\\w\\d\\-\\.]+)\:

それを確実に見つけるのに十分なはずです。これはおそらくより良い正規表現ですが:

ホスト名の正規表現

于 2013-02-15T13:05:31.107 に答える
0

正規表現にいくつかのエラーがあります:

[//]-は文字クラスをマークしているため、これは1文字のみであり、[]完全には一致しません//。一致させるには、次のように記述する必要があります:[/][/]または\/\/

(.*)-これは、すべての文字を行末に一致させます。特定のキャラクターまで行きたい場合は、より具体的にする必要があります。たとえば、次のように、コロンではないすべての文字をフェッチしてコロンに移動できます([^:]*)

:*-これにより、コロンがオプションになります。次のように、コロンの後にドット(すべての文字)を置くのを忘れたと思います:.*

修正された正規表現は次のとおり\/\/([^:]*):.*です。

お役に立てれば。

ところで。製造後にポート番号がオプションである場合(:5432)、次の正規表現をお勧めします。 \/\/([^/]*)(?::\d+)?\/

于 2013-02-15T13:16:31.710 に答える
0

Oracle と MySQL の JDBC URL バリアントもその癖でキャプチャするために (たとえば、Oracle は@の代わりに//またはの使用を許可しています@//)、この正規表現を使用してホスト名を取得します。[/@]+([^:/@]+)([:/]+|$)次に、ホスト名はグループ 1 に含まれます。

コード例

String jdbcURL = "jdbc:oracle:thin:@//hostname:1521/service.domain.local";
Pattern hostFinderPattern = Pattern.compile("[/@]+([^:/@]+)([:/]+|$)");
final Matcher match = hostFinderPattern.matcher(jdbcURL);
if (match.find()) {
  System.out.println(match.group(1));
}

これは、次のすべての URL (およびその他のバリアント) で機能します。

jdbc:oracle:thin:@//hostname:1521/service.domain.local
jdbc:oracle:thin:@hostname:1521/service.domain.local
jdbc:oracle:thin:@hostname/service.domain.local
jdbc:mysql://localhost:3306/sakila?profileSQL=true
jdbc:postgresql://production:5432/dbname
jdbc:postgresql://production/
jdbc:postgresql://production

これは、

  • ホスト名は、//または@その組み合わせの後にあります(単一/でも機能しますが、JDBCでは許可されていないと思います)。

  • ホスト名の後に、:または/または 文字列の終わりが続きます。

は貪欲であることに注意してください+。これは、中間のものにとって特に重要です。

于 2016-11-23T14:22:52.887 に答える