我想匹配,可以有字母和一個可選的連字符的電話號碼:正則表達式來匹配電話號碼?
- 這是有效的:
333-WELL
- 這也是正確的:
4URGENT
換句話說,可以最多隻有一個連字符,但如果沒有連字符,則最多可以有七個0-9或AZ字符。
我不知道該怎麼做,並在正則表達式「如果語句」。這甚至有可能嗎?
我想匹配,可以有字母和一個可選的連字符的電話號碼:正則表達式來匹配電話號碼?
333-WELL
4URGENT
換句話說,可以最多隻有一個連字符,但如果沒有連字符,則最多可以有七個0-9或AZ字符。
我不知道該怎麼做,並在正則表達式「如果語句」。這甚至有可能嗎?
你們尋找的交替操作,用管道字符表示:|
但是,您可能需要或者7倍的替代品(各1個連字符的位置+ 1沒有連字符),或者你可能需要3之間的連字符第四個字符並使用2個選項。
一個交替使用運營商的定義了兩種備選方案,如:
({3,3}[0-9A-Za-z]-{4,4}[0-9A-Za-z]|{7,7}[0-9A-Za-z])
謝謝你給我展示的方式! – sivabudh 2009-11-15 05:34:35
我想這應該這樣做:
/^[a-zA-Z0-9]{3}-?[a-zA-Z0-9]{4}$/
這3個字母或數字後面跟着一個可選連字符後面4個字母或數字匹配。這個以紅寶石工作。根據你使用的正則表達式引擎,你可能需要稍微修改它。
我有一個問題..所以我測試了上述正則表達式,它工作正常。然而,當我添加更多的數字到最後,正則表達式驗證器仍然說它是有效的。這是爲什麼?當我添加1個字符時,該表達式是否應該失效?我在http://tools.netshiftmedia.com/regexlibrary/使用121333333 – sivabudh 2009-11-15 05:43:01
+1進行測試以獲得簡單性 – 2009-11-15 05:44:05
@ ShaChris23,因爲121333333在開始時也與它匹配。對於真正的全長匹配,它將是'/^[a-zA-Z0-9] {3} - ?[a-zA-Z0-9] {4} $ /'(使用'^'和' $'符號來表示字符串的開頭和字符串的結尾(分別)) – 2009-11-15 05:45:15
不知道這計數,但我打破它分爲兩個正則表達式:
#!/usr/bin/perl
use strict;
use warnings;
my $text = '333-URGE';
print "Format OK\n" if $text =~ m/^[\dA-Z]{1,6}-?[\dA-Z]{1,6}$/;
print "Length OK\n" if $text =~ m/^(?:[\dA-Z]{7}|[\dA-Z-]{8})$/;
這應該避免接受多個破折號,在錯誤的地方劃線,等等
假設你想讓連字符在任何地方,lookarounds將會對你有用。事情是這樣的:
^([A-Z0-9]{7}|(?=^[^-]+-[^-]+$)[A-Z0-9-]{8})$
有兩個主要部分,以這種模式:[A-Z0-9]{7}
匹配一個連字符無弦和(?=^[^-]+-[^-]+$)[A-Z0-9-]{8}
匹配一個連字符的字符串。
(?=^[^-]+-[^-]+$)
將匹配任何帶有單個連字符的字符串(並且連字符不是第一個或最後一個字符),那麼[A-Z0-9-]{8}
部分將計算字符並確保它們全都有效。
答案已被接受,但我想知道:連字符可以在數字中的任何位置,或者它必須始終(如果有的話)在第3位和第4位之間? – 2009-11-15 07:14:42
是否有你需要使用正則表達式的原因? – voyager 2009-11-15 15:13:49
@Carl Smotricz:它可以在任何地方。好問題。 – sivabudh 2009-11-15 20:06:38