私はそれらに慣れておらず、Java 構文の「一致」に問題があります。
私は2つのファイルを持っています.1つは111.123.399.555.xml
もう1つはですConf.xml.
今、正規表現で最初のファイルを取得したいだけです。
string.matches("[1-9[xml[.]]]");
動作しません。
これを行う方法?
はキャプチャ グループではなく文字クラス グループを作成する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 のパターン ドキュメントを参照してください。
string.matches("[1-9.]+\\.xml")
するべきです。
[1-9.]+
1 から 9 までの 1 つ以上の数字および/またはピリオドに一致します。( +
「1つ以上」を*
意味し、「ゼロ以上」を?
意味し、「ゼロまたは1つ」を意味します)。\.xml
一致し.xml
ます。は正規表現で「任意の文字」を意味するため.
、リテラルのピリオドを意味する場合はエスケープする必要があります\.
(これは Java 文字列内にあるため、バックスラッシュ自体を 2 倍にしてエスケープする必要があります)。