2

JavaScript RegEx の一致に大きな問題があります。Java 側では、RegEx 分割式の動作が JS 側とは異なります。私はそれを次の例に落とし込みました。おそらく根本的な原因を知っていますか?

テスト文字列: test == 1.

を一致させたいです== 1(後でこれをスプリッターとして使用しますが、私の質問には関係ありません)。

削除された正規表現: ([=\s]+).*?(?:[=]|\z)+

Java 側の結果 ( http://gskinner.com/RegExr/ ) は次のように一致します。== 1

JS 側の結果 ( http://www.regular-expressions.info/javascriptexample.html ) は次のように一致します:==および=

なぜ?正規表現 JS を Java 側と同じように動作させるにはどうすればよいですか?

4

1 に答える 1

3

\AJavaScript は文字列アンカーの開始と\Z終了をサポートしていないため、 で一致を終了する必要があり=ます。$代わりに行末アンカーを使用してください。

編集
そこにも一致するものは1つしかありません。コードを見て追加alert(m);すると

alert(m); // ["== 1", "=="]

var s = "Match at position " + m.index + ":\n";
for (i = 0; i < m.length; i++) {
  s = s + m[i] + "\n";
}
alert(s);

m[0]は、実際の一致 ( Matcher#group(0)Java の場合と同様) とm[1]最初のグループ キャプチャを提供します。

EDIT : (Java と JavaScript のString.split()メソッドの違い)

  • Java とは異なり、JavaScript のsplit()は、区切り文字の正規表現で指定されたキャプチャ グループを結果の配列で返します。したがって、最初の正規表現グループを としてキャプチャしないようにする必要があります(?:[&=\\s]+)?

  • Java のsplit()メソッドでは、末尾の空の文字列は結果の配列に含まれません。JavaScript コードでは、それらを自分で無視する必要があります。ただし、入力文字列の性質(ブール条件)を考えると、入力文字列は常に区切り文字で終わるため、最後の要素を安全に削除できます。

于 2013-08-02T12:08:39.210 に答える