2

部分的なパターンマッチングを実行する必要があるため、次の入力に対してパターンマッチングをテストしました

Pattern p = Pattern.compile("hello");
Matcher m = p.matcher("[a-z]");

誰かが私に理由を説明できますか

System.out.println(m.find() || m.hitEnd());

true中に印刷

System.out.println(m.hitEnd());

プリントfalse

4

3 に答える 3

2

アップデート:

それm.find()自体がパターンを完全に処理しますが、一致するものが見つからないためです(そして戻りますfalse)。この呼び出しの後、パターンは完全に消費されるため、hitEnd()結果はになりtrueます。

2番目の呼び出しでは、パターンは消費されないため、をhitEnd()返しますfalse

hitEnd()Javadocの場合:

このマッチャーによって実行された最後の一致操作で検索エンジンが入力の終わりに到達した場合、trueを返します。

@jlordoからのコメントを反映して:多分あなたはパターンとテキストを変更したいでしょう:

Pattern p = Pattern.compile("[a-z]");
Matcher m = p.matcher("hello");

"[a-z]"むしろパターンのように見えるからです。

于 2013-01-21T14:49:32.980 に答える
2

このプログラムを見てください:

Pattern p = Pattern.compile("hello");
Matcher m = p.matcher("[a-z]");
System.out.println(m.hitEnd()); // prints false
System.out.println(m.find());  // prints false
System.out.println(m.hitEnd()); // prints true

m.hitEnd()戻り値の最初の呼び出しに注意してくださいfalseJavaDocを見てください、それは言います:

このマッチャーによって実行された最後の一致操作で検索エンジンが入力の終わりに到達した場合、trueを返します。

ここではfalse、の呼び出しの前に呼び出されm.find()、マッチャーはまだ一致操作を実行していないため、を返します。それの呼び出しがm.find()戻った後truefind()完全な入力文字列を消費し、最後に到達するため)。その意味はJavaDocでも説明されています。

このメソッドがtrueを返す場合、より多くの入力が最後の検索の結果を変更した可能性があります。

これがtrueを返す場合、マッチャーが入力の最後にヒットしたことを意味します。この場合、ヒットとは一致せずに到達したことを意味します。(入力はマッチャーによって完全に消費されました)。

編集

[a-z]正規表現の入力文字列であるあなたがそれを望んでいることを願っていますが、その逆でhelloはありません。あなたが持っていた場合

Pattern p = Pattern.compile("[a-z]"); // The regex needs to be compiled.
Matcher m = p.matcher("hello");       // The input is given to the matcher
while (m.find()) {                    // In this case, returns true 5 times
    System.out.println(m.group() + ", ");
}

あなたの出力は

h, e, l, l, o, 
于 2013-01-21T15:06:28.597 に答える
0
System.out.println(m.find() || m.hitEnd());

m.find()はブール値を返します-そのブール値はfalseです。入力検索の最後のヒットを処理しました-これにより、m.hitend()の結果がtrueになります。false || したがって、trueはtrueに相当します。

前の操作は終わりに達しました-hitend()はtrueを返しますif..well、ここにjavadocがあります:

Returns true if the end of input was hit by the search engine in the last 
match operation performed by this matcher.

最後の操作で終わりに到達しませんでした。したがって、hitend()はfalseです。連続した呼び出しはfalseになります。

于 2013-01-21T14:50:05.283 に答える