0

私はそれらに慣れておらず、Java 構文の「一致」に問題があります。

私は2つのファイルを持っています.1つは111.123.399.555.xmlもう1つはですConf.xml.

今、正規表現で最初のファイルを取得したいだけです。

string.matches("[1-9[xml[.]]]");

動作しません。

これを行う方法?

4

2 に答える 2

6

はキャプチャ グループではなく文字クラス グループを作成するstring.matches("[1-9[xml[.]]]");ため、 の使用は機能しません。[]

これが意味することは、Javaにとって、あなたの式が言って"match any of: [1-to-9 [or x, or m, or l [or *any*]]]"いることです(*any*は、エスケープしなかったためです。., そして、それはa match any characterコマンドを作成します)


重要:

"\" は Java によってリテラル エスケープ文字として認識され、実際のマッチャーのエスケープ文字 ("\" でも文字列形式) としてマッチャーに送信されるためには、それ自体をエスケープする必要があります。マッチャーで「\」を使用するつもりなら、実際には「\\」を使用する必要があります。

慣れていない場合、これは少し混乱しますが、要約すると、一致する実際の「\」をマッチャーに送信するには、 「\\\\」を使用する必要がある場合があります。最初の "\\" はマッチャーに対して "\" になるため、スケープ文字になり、最初の文字によってエスケープされた 2 番目の "\\" は実際の "\" 文字列になります!


###.###.###.###.xml「#」が常に数字であるパターンに一致する正しいパターン文字列はstring.matches("(\\d{3}\\.){4}xml")であり、その仕組みは次のとおりです。

  • \\d= は 1 桁の文字に一致します。を使用するのと同じですが、[0-9]より単純です。
  • {3}は、前の に対して「ちょうど 3 回」の一致を指定し ます\\d。したがって、一致し###ます。
  • \\.単一のドット文字に一致します。
  • 前の()コードを囲むと、「これはキャプチャ グループです」とマッチャーに伝えられます。それは次の によって使用され、{4}「このグループ全体###.に正確に 4 回一致」を作成し、「一致###.###.###.###.」を作成します。
  • そして最後にxml、パターン文字列が終了する前の は「xml」と正確に一致し、前の項目に沿って、そのパターン「###.###.###.###.xml」と完全に一致します。

さらに学習するには、Java のパターン ドキュメントを参照してください。

于 2012-05-08T12:19:42.557 に答える
1
string.matches("[1-9.]+\\.xml")

するべきです。

  • [1-9.]+1 から 9 までの 1 つ以上の数字および/またはピリオドに一致します。( +「1つ以上」を*意味し、「ゼロ以上」を?意味し、「ゼロまたは1つ」を意味します)。
  • \.xml一致し.xmlます。は正規表現で「任意の文字」を意味するため.、リテラルのピリオドを意味する場合はエスケープする必要があります\.(これは Java 文字列内にあるため、バックスラッシュ自体を 2 倍にしてエスケープする必要があります)。
于 2012-05-08T11:29:40.053 に答える