Androidプラットフォーム2.2.3をターゲットにしているときに正規表現に問題があります。Androidの単語境界正規表現
次の正規表現は、デスクトップ上でJava VMをターゲットにするときに機能し、正規表現も.NETアプリケーションで動作します。
Pattern.compile("\\b?")
私の携帯電話をターゲットにすると、PatternSyntaxExceptionが発生します。何か案は?
Androidプラットフォーム2.2.3をターゲットにしているときに正規表現に問題があります。Androidの単語境界正規表現
次の正規表現は、デスクトップ上でJava VMをターゲットにするときに機能し、正規表現も.NETアプリケーションで動作します。
Pattern.compile("\\b?")
私の携帯電話をターゲットにすると、PatternSyntaxExceptionが発生します。何か案は?
これは、Androidエミュレータでは実行されているが、通常のJavaアプリケーションでは実行されていない場合、PatternSyntaxException
がスローされることが確認できます。 Androidで使用されている正規表現の実装が通常のJava SDKとは異なるという事実以外の理由がわかりません。 PatternからAndroidデベロッパーページ:
Androidで使用される正規表現の実装は、ICUによって提供されています。正規表現の表記法は、ほとんどの場合、他のJava言語実装で使用されているもののスーパーセットです。つまり、既存のアプリケーションは通常どおり動作しますが、まれにAndroidが他の実装で受け入れられない正規表現を受け入れることがあります。
回避策として、私はあなたが非キャプチャグループに単語境界アサーションを囲むことで例外を回避できることを発見しました。
Pattern.compile("(?:\\b)?");
は、(キャプチャグループは、同様に動作しますが、私はあなたがそれを必要と疑う。)
私はあなたが正式な回答を得ることができるかどうかを確認するためにあなたにreport this as a bugを示唆しています。 (私はすでに検索しており、まだ報告されていないようです)
しかし、それはAndroidがリファレンス実装が受け入れるいくつかの正規表現を拒否するという意味でのみバグです。ゼロ幅のアサーションを含めることは絶対に意味がないので、それをオプションにしてください。 *これを拒否することによって、コンパイラーは、誤植であるか、著者の一部であるかを理解していないことを警告しています。 –
@ AlanMoore私はOPの正規表現の残りの部分がオプションの単語境界を必要とするように見えるかもしれないと想像しようとしていましたが、あなたが正しいと思います。それは意味をなさない。あなたがオプションの単語境界を作る方法は、それを正規表現に全く含まないことです。 –
@ビルドリザード合意。私はそれが意味をなさないとは思わない。私は元の正規表現の著者ではありません。おそらく、私は彼らの使い方を誤解していたでしょうか?おそらくキャプチャグループの一部になる可能性があります。とにかく、同じソリューションを自分のやり方で実装することに決めました。 – Tentux
エラーの動機はわかりませんが、これはオプションですが長さゼロです。結局後に一致するつもり?? – Gabber
これは、別のプロジェクトのかなり複雑な正規表現です。しかし、なぜオプションの単語境界が無効なパターン構文であるべきかわかりません。 – Tentux