5

私は SCJP ガイドを読んでいて、次の質問を見つけました。これは非常に簡単に見え、誰かにとっては簡単かもしれません。しかし、私は解決策を見つけるのに本当に行き詰まりました。

import java.util.regex.*;

class study{

    public static void main(String[] args) {
      Pattern p = Pattern.compile(args[0]);
      Matcher m = p.matcher(args[1]);
      boolean b=false;
      while(b=m.find()){
      System.out.print(m.start()+" "+m.group());
     }
    }

}

その質問では、コマンドライン引数は次のように与えられました

java study "\d*" ab34ef

そして、出力はどうなるかと言うと、私の推測では334または234で、そのオプションにありました。しかし、回答 ( Windowsの場合) は01234456 でした。それで、私の最初の質問はどのように??

今、人々は言う、なぜあなたは試みなかった. それから、私は言うでしょう、はい、そうしました。しかし、私の場合、画面に何も出力されませんでした。次に、すべてのタイプの入力とその値を考慮して理解しようとしました。

ここに画像の説明を入力

System.out.print(args[0]+" "+args[1]);上記のスクリーンショットでは、 main メソッド内に含まれている場合の 2 番目の出力が示されています。

でも、コマンドラインをこれに変更しました

java study "\\d*" ab34ef

また、出力が得られませんでした。だから、誰でもこのことを説明してください。

出力==

java study "\d*" ab34ef
No output
java study "\\d*" ab34ef
No output

次に、System.out.print(args[0]+" "+args[1]);main メソッド内に追加します。

java study "\d*" ab34ef
\Document and Setting ab34ef
java study "\\d*" ab34ef
\\d* ab34ef

注 :出力がないということは、何も表示されていないことを意味します。

4

4 に答える 4

4

実際には、コマンドライン引数として渡すと、ワイルドカードが続く\d*ものとして扱われます。したがって、引数は、そのディレクトリ内で始まるすべてのファイルに置き換えられます。(この動作は で発生します。使用していないのでわかりませんが)。\d*\dWindowsLinux

したがって、正規表現を渡すのではなく、\din で始まるファイル/ディレクトリ名をプログラムに渡します。

コード内の引数を出力してみてください: -

System.out.println(args[0] + " : " + args[1]);

これにより、で始まるいくつかのファイル/ディレクトリ名が得られます\d...


回避策: -

正規表現を渡したい場合は、回避策を使用できます。" \d*"前にスペースを入れて正規表現として渡し、コードではargs[0].trim()orargs[0].replace(" ", "");の代わりに使用しますargs[0]

したがって、次のように呼び出します: -

java Foo " \d*" ab34ef

コードを次のように変更します。 -

Pattern p = Pattern.compile(args[0].replace(" ", ""));
Matcher m = p.matcher(args[1]);

これはあなたのために仕事をします。


これが、コマンドラインを介して正規表現を渡す問題でした。

その出力が得られる理由については、同様の問題に関するこの回答 - string-replaceall-strange-behaviourを確認してください。なぜこれが起こっているのかがわかります。

于 2012-12-20T11:42:41.680 に答える
0

これを試して。

java study d* ab34ef

これが理由です。

エスケープ シーケンスは Java コンパイラ用です。コンパイラは、たとえば、「\」の後に「n」が続くと認識し、両方を 1 つの改行文字に置き換えます。プログラムの実行中は、エスケープ シーケンスは Java にとってまったく意味がありません。ソース コードに表示された場合にのみ、コンパイラにとって意味があります。

Java プログラムの引数に特殊文字を埋め込むことは、実際には Java の問題ではなく、オペレーティング システムの問題です。

ソースから同じことをしたい場合は、以下のように文字列を渡す必要があります。

Pattern p = Pattern.compile("\\d*");
Matcher m = p.matcher("ab34ef");

コマンドラインで実行したい場合は、エスケープ文字なしで渡すだけで十分です

 d* ab34ef

Eclipseなどの IDE を使用してデバッグし、渡されたものを正確に見つけます。

于 2012-12-20T11:28:57.000 に答える
0

質問の最初の部分に答えるために、正規表現は0\d*個以上の数字に一致します。つまり、一致できるものの 1 つは空の文字列です。したがって、入力文字列が与えられた場合

ab34ef

パターンが一致する

  • 位置 0 の空の文字列
  • 位置 1 の空の文字列
  • 34位置 2の文字列
  • 位置 4 の空の文字列
  • 位置 5 の空の文字列
  • 位置 6 の空の文字列

これは、予想される答えを説明しています。

于 2012-12-20T11:42:00.273 に答える
0

私はあなたが望んでいた結果を得ました

java study "\d*" ab34ef

Rohit Jainしかし、コメントされているように、同じことを試してみてください:

java study "\\d*" ab34ef

しかし、それはあなたのラインで動作するはずです! (Linuxではそうです、多分それはWindowsの問題です)

于 2012-12-20T11:23:39.663 に答える