最後に、基本的に電話番号を E164 適合番号に変換する正規表現が必要です。今のところ、私はこれを得ました:
result = s.replaceAll("[(*)|+| ]", "");
スペース、「+」記号、中括弧「()」など、すべてをうまく置き換えます。しかし、中かっこの内容と一致しないため、たとえば、数値+49 (0)11 111 11 11
は に置き換えられ49111111111
ます。
どうすればこれを機能させることができますか?
最後に、基本的に電話番号を E164 適合番号に変換する正規表現が必要です。今のところ、私はこれを得ました:
result = s.replaceAll("[(*)|+| ]", "");
スペース、「+」記号、中括弧「()」など、すべてをうまく置き換えます。しかし、中かっこの内容と一致しないため、たとえば、数値+49 (0)11 111 11 11
は に置き換えられ49111111111
ます。
どうすればこれを機能させることができますか?
あなたはそれを行うことができますが、括弧の間にゼロ以上のものがある場合はどうなりますか?
result = s.replaceAll("\\([^()]*\\)|[*+ ]+", "");
詳細な正規表現として:
result = s.replaceAll(
"(?x) # Allow comments in the regex. \n" +
"\\( # Either match a ( \n" +
"[^()]* # then any number of characters except parentheses \n" +
"\\) # then a ). \n" +
"| # Or \n" +
"[*+\\ ]+ # Match one or more asterisks, pluses or spaces", "");
[(*)|+| ]
単一の括弧、アスタリスク、バー、プラス、またはスペース文字に一致する文字クラスです。角かっこを取り除き、次のようなものを使用します
s.replaceAll("\\(.*?\\)|\\D", "");
これにより、括弧の間 (および括弧を含む) と数字以外のすべてが削除されます。これは、ネストされた括弧をうまく処理できないことに注意してください。開き括弧から最初に見つかった閉じ括弧まですべてを食べてしまうため、(アンバランスな閉じ括弧は a として削除されます)に変更(123(45)67)
されます。67
\D
文字クラスに期待しすぎていると思います。まず、文字クラスでは使用しないでください|
。文字クラスによって一致するのは、単なる別の文字です。含めたいすべての文字を区切り記号なしでリストするだけです。
第二に、文字クラスは実際には単一の文字にのみ一致します。したがって(*)
、文字クラス内では、定義により、 remove (
、または*
(文字通り)または)
. 入力に入れ子になった括弧や一致しない括弧などが含まれないことが 100% 確実な場合は、次のようにすることができます。
"(?:\\([^)]\\)|\\D)+"
これを試してみてください: "(\\(\\d+\\))|\\+|\\s"
. 括弧と中身、プラス記号、およびスペースを削除します。