電話番号をダイヤルする前に、電話番号が有効かどうかを確認する必要があります。電話は世界のどこにでも行くことができます。
有効な国際電話番号に一致する正規表現は何ですか?
電話番号をダイヤルする前に、電話番号が有効かどうかを確認する必要があります。電話は世界のどこにでも行くことができます。
有効な国際電話番号に一致する正規表現は何ですか?
回答:
\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)\d{1,14}$
一般的な国際電話番号を照合するための正しい形式です。米国の固定電話中心の国際アクセスコード011を、標準の国際アクセスコード識別子である「+」に置き換えて、必須にしました。また、国番号の最小値を少なくとも1桁に変更しました。
この形式の番号を携帯電話のアドレス帳に入力すると、どこに旅行しても、アドレス帳のどの番号にも問題なく電話をかけることができます。固定電話の場合は、plusを、ダイヤル元の国の国際アクセスコードに置き換えます。
これは、国内番号計画の規則を考慮に入れていないことに注意してください。具体的には、国番号計画が許可しない場所でゼロと1を許可し、一部の国(たとえば、米国)の国内番号計画より長い番号の長さも許可します。
^\+((?:9[679]|8[035789]|6[789]|5[90]|42|3[578]|2[1-689])|9[0-58]|8[1246]|6[0-6]|5[1-8]|4[013-9]|3[0-469]|2[70]|7|1)(?:\W*\d){0,13}\d$
00
、前に置くことは理にかなっているかもしれません。開発と保守の観点から、すべての番号を最初から取得するか、取得するたびに+
置き換えるように強制してもまったく問題ないと思います。特に、ほとんどの人が形式(ほとんどの国際電話の入力フィールド)を知っていることを考えるととにかく必要です)。加えて、それはワンライナーの修正であり、より読みやすくなっています。このアプローチにより、すべての電話番号が同じ形式であることが保証され、検証でエラーが発生しにくくなり、全体の保守が容易になります。00
+
+
00
するとメッセージが正しく送信されませんでした+
が、aで始まると常に国際的に機能します。私たちは夢中になって、それを超複雑にすることができますが、時々、私たちの生活を楽にするためにいくつかの制約を
すべての国コードはITUによって定義されています。次の正規表現は、ITU-T E.164およびITU運用速報No. 930 – 15.IV.2009の付録に基づいています。現在のすべての国コードと将来の使用のために予約されているコードが含まれています。少し短くできるかもしれませんが、各コードを個別に含めることにしました。
これは米国から発信された通話用です。他の国では、国際アクセスコード(正規表現の先頭の011)を、その国のダイヤリングプランに適したものに置き換えます。
また、ITU E.164は、完全な国際電話番号の最大長を15桁に定義していることに注意してください。つまり、3桁の国コードは最大12桁追加され、1桁の国コードは最大14桁追加される可能性があります。従って
[0-9]{0,14}$
正規表現の終わり。
最も重要なのは、この正規表現は番号が有効であることを意味しません-各国が独自の内部番号計画を定義します。これは、国コードが有効であることを確認するだけです。
283 | 282 | 281 | 280 | 269 | 268 | 267 | 266 | 265 | 264 | 263 | 262 | 261 | 260 | 259 | 258 | 257 | 256 | 255 | 254 | 253 | 252 | 251 | 250 | 249 | 248 | 247 | 246 | 245 | 244 | 243 | 242 | 241 | 240 | 239 | 238 | 237 | 236 | 235 | 234 | 233 | 232 | 231 | 230 | 229 | 228 | 227 | 226 | 225 | 224 | 223 | 222 | 221 | 220 | 219 | 218 | 217 | 216 | 215 | 214 | 213 | 212 | 211 | 210 | 98 | 95 | 94 | 93 | 92 | 91 | 90 | 86 | 84 | 82 | 81 | 66 | 65 | 64 | 63 | 62 | 61 | 60 | 58 | 57 | 56 | 55 | 54 | 53 | 52 | 51 | 49 | 48 | 47 | 46 | 45 | 44 | 43 | 41 | 40 | 39 | 36 | 34 | 33 | 32 | 31 | 30 | 27 | 20 | 7 | 1)[0-9] {0、14} $
これはさらなる最適化です。
\+(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)
\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*\d\W*(\d{1,2})$
(i)有効な国際プレフィックス
(ii)の後に続く9桁または10桁を許可し、任意のタイプまたは区切り文字の配置(最後の2桁の間を除く)
これは一致します:
+ 1-234-567-8901
+ 61-234-567-89-01
+ 46-234 5678901
+1(234)56
89901 +1(234)56-89 901
+46.234.567.8901
+1 / 234/567/8901
Google のライブラリlibphonenumberを使用できます。
PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
String decodedNumber = null;
PhoneNumber number;
try {
number = phoneNumberUtil.parse(encodedHeader, null);
decodedNumber = phoneNumberUtil.format(number, PhoneNumberFormat.E164);
} catch (NumberParseException e) {
e.printStackTrace();
}
これが正規表現の「最適化された」バージョンです。
^011(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|
2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|
4[987654310]|3[9643210]|2[70]|7|1)\d{0,14}$
正規表現の構文でがサポートされていない場合は、\d
sをに置き換えることができ[0-9]
ます\d
。
iOS SWIFTの場合、これは役に立ちました。
let phoneRegEx = "^((\\+)|(00)|(\\*)|())[0-9]{3,14}((\\#)|())$"
@Ericの正規表現が変更されました-すべての国コードのリストが追加されました(xxxdepy @ Githubから取得しました。役立つと思います:
/(\+|00)(297|93|244|1264|358|355|376|971|54|374|1684|1268|61|43|994|257|32|229|226|880|359|973|1242|387|590|375|501|1441|591|55|1246|673|975|267|236|1|61|41|56|86|225|237|243|242|682|57|269|238|506|53|5999|61|1345|357|420|49|253|1767|45|1809|1829|1849|213|593|20|291|212|34|372|251|358|679|500|33|298|691|241|44|995|44|233|350|224|590|220|245|240|30|1473|299|502|594|1671|592|852|504|385|509|36|62|44|91|246|353|98|964|354|972|39|1876|44|962|81|76|77|254|996|855|686|1869|82|383|965|856|961|231|218|1758|423|94|266|370|352|371|853|590|212|377|373|261|960|52|692|389|223|356|95|382|976|1670|258|222|1664|596|230|265|60|262|264|687|227|672|234|505|683|31|47|977|674|64|968|92|507|64|51|63|680|675|48|1787|1939|850|351|595|970|689|974|262|40|7|250|966|249|221|65|500|4779|677|232|503|378|252|508|381|211|239|597|421|386|46|268|1721|248|963|1649|235|228|66|992|690|993|670|676|1868|216|90|688|886|255|256|380|598|1|998|3906698|379|1784|58|1284|1340|84|678|681|685|967|27|260|263)(9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)\d{4,20}$/
これまでに与えられたさまざまな答えのすべてによって証明されるように、これを行う方法は明らかにたくさんありますが、ここに$ 0.02相当の価値を投げて、以下の正規表現を提供します。これは、上記のほとんどすべてより少し簡潔です。 、しかし、ほとんどよりも徹底的に。また、国コードを$ 1に、市内番号を$ 2にしておくという良い副作用もあります。
^ \ +(?= \ d {5,15} $)(1 | 2 [078] | 3 [0-469] | 4 [013-9] | 5 [1-8] | 6 [0-6] | 7 | 8 [1-469] | 9 [0-58] | [2-9] ..)(\ d +)$
public static boolean validateInternationalPhoneNumberFormat(String phone) {
StringBuilder sb = new StringBuilder(200);
// Country code
sb.append("^(\\+{1}[\\d]{1,3})?");
// Area code, with or without parentheses
sb.append("([\\s])?(([\\(]{1}[\\d]{2,3}[\\)]{1}[\\s]?)|([\\d]{2,3}[\\s]?))?");
// Phone number separator can be "-", "." or " "
// Minimum of 5 digits (for fixed line phones in Solomon Islands)
sb.append("\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?\\d[\\-\\.\\s]?");
// 4 more optional digits
sb.append("\\d?[\\-\\.\\s]?\\d?[\\-\\.\\s]?\\d?[\\-\\.\\s]?\\d?$");
return Pattern.compile(sb.toString()).matcher(phone).find();
}
以下は、次の最も一般的な電話番号シナリオの正規表現です。これは、米国の市外局番の観点から調整されていますが、国際的なシナリオで機能します。
有効な電話番号をすべてゼロにすることはできません。
^(?!\b(0)\1+\b)(\+?\d{1,3}[. -]?)?\(?\d{3}\)?([. -]?)\d{3}\3\d{4}$
説明:
^ - start of expression
(?!\b(0)\1+\b) - (?!)Negative Look ahead. \b - word boundary around a '0' character. \1 backtrack to previous capturing group (zero). Basically don't match all zeros.
(\+?\d{1,3}[. -]?)? - '\+?' plus sign before country code is optional.\d{1,3} - country code can be 1 to 3 digits long. '[. -]?' - spaces,dots and dashes are optional. The last question mark is to make country code optional.
\(?\d{3}\)? - '\)?' is to make parentheses optional. \d{3} - match 3 digit area code.
([. -]?) - optional space, dash or dot
$ - end of expression
電話番号の検証には、次のAPIを試してください。また、これは国、地域、プロバイダーを返します
デモ https://libphonenumber.appspot.com/
git https://github.com/googlei18n/libphonenumber/releases/tag/v8.9.0
これは実際にRegExpを使用して仕事を完了していません-またはおそらくそのため-これは私にとって素晴らしい解決策のように見えます:https : //intl-tel-input.com/node_modules/intl-tel-input/examples /gen/is-valid-number.html
これを試してください、それは私のために働きます。
^(00|\+)[1-9]{1}([0-9][\s]*){9,16}$
私はヨーロッパの電話番号の正規表現を作成しましたが、これはダイヤルプレフィックスと番号の長さに対して固有です。
const PhoneEuropeRegExp = () => {
// eu phones map https://en.wikipedia.org/wiki/Telephone_numbers_in_Europe
const phonesMap = {
"43": [4, 13],
"32": [8, 10],
"359": [7, 9],
"385": [8, 9],
"357": 8,
"420": 9,
"45": 8,
"372": 7,
"358": [5, 12],
"33": 9,
"350": 8,
"49": [3, 12],
"30": 10,
"36": [8, 9],
"354": [7, 9],
"353": [7, 9],
"39": [6, 12],
"371": 8,
"423": [7, 12],
"370": 8,
"352": 8,
"356": 8,
"31": 9,
"47": [4, 12],
"48": 9,
"351": 9,
"40": 9,
"421": 9,
"386": 8,
"34": 9,
"46": [6, 9],
};
const regExpBuilt = Object.keys(phonesMap)
.reduce(function(prev, key) {
const val = phonesMap[key];
if (Array.isArray(val)) {
prev.push("(\\+" + key + `[0-9]\{${val[0]},${val[1]}\})`);
} else {
prev.push("(\\+" + key + `[0-9]\{${val}\})`);
}
return prev;
}, [])
.join("|");
return new RegExp(`^(${regExpBuilt})$`);
};
alert(PhoneEuropeRegExp().test("+420123456789"))