0

一部のユーザー入力テストを Java から JavaScript に移行したいと考えています。このコードは、ワイルドカード文字をユーザー入力文字列から任意の位置で削除することを想定しています。次のJava表記をJavaScriptに変換しようとしていますが、エラーが発生し続けます

"Invalid regular expression: /(?<!\")~[\\d\\.]*|\\?|\\*/: Invalid group".

正規表現の経験はほとんどありません。どんな助けでも大歓迎です: JAVA:

str = str.replaceAll("(?<!\")~[\\d\\.]*|\\?|\\*","");

私の失敗したJavaScriptのバージョン:

input = input.replace( /(?<!\")~[\\d\\.]*|\\?|\\*/g, '');    
4

1 に答える 1

0

anubhava が指摘するように、問題は JavaScript が後読みアサーションをサポートしていないことです。悲しいけれど事実です。元の正規表現の後読みアサーションは(?<!\"). 具体的には、二重引用符で始まらない文字列のみを探します。

しかし、すべてが失われるわけではありません。後読みと同じ結果を得るために使用できるいくつかのトリックがあります。この場合、後読みは、チルダの前の文字も置き換えられないようにするためだけに存在します。とにかく文字を一致させることで JavaScript でこれを実現できますが、それを置換に含めます。

input = input.replace( /([^"])~[\d.]*|\?|\*/g, '$1' );

代替\?\*の場合、グループは存在$1しないため、空の文字列に評価されるため、置換に含めても問題はありません。

注: これは元の正規表現と 100% 同等ではありません。特に、ルックアラウンド アサーション (上記のルックビハインドなど) は、入力ストリームが消費されるのを防ぎます。これは、互いにすぐ隣にあるものを照合するときに非常に役立つ場合があります。ただし、この場合、それが問題になる方法は考えられません。完全に同等の正規表現を作成するのはもっと難しいでしょうが、これは元の正規表現の必要性を満たしていると思います。

于 2013-11-12T18:34:58.100 に答える