2009-11-15 89 views
2

我想匹配,可以有字母和一個可選的連字符的電話號碼:正則表達式來匹配電話號碼?

  • 這是有效的:333-WELL
  • 這也是正確的:4URGENT

換句話說,可以最多隻有一個連字符,但如果沒有連字符,則最多可以有七個0-9或AZ字符。

我不知道該怎麼做,並在正則表達式「如果語句」。這甚至有可能嗎?

+0

答案已被接受,但我想知道:連字符可以在數字中的任何位置,或者它必須始終(如果有的話)在第3位和第4位之間? – 2009-11-15 07:14:42

+0

是否有你需要使用正則表達式的原因? – voyager 2009-11-15 15:13:49

+1

@Carl Smotricz:它可以在任何地方。好問題。 – sivabudh 2009-11-15 20:06:38

回答

4

你們尋找的交替操作,用管道字符表示:|

但是,您可能需要或者7倍的替代品(各1個連字符的位置+ 1沒有連字符),或者你可能需要3之間的連字符第四個字符並使用2個選項。

一個交替使用運營商的定義了兩種備選方案,如:

({3,3}[0-9A-Za-z]-{4,4}[0-9A-Za-z]|{7,7}[0-9A-Za-z]) 
+1

謝謝你給我展示的方式! – sivabudh 2009-11-15 05:34:35

0

謝謝希思Hunnicutt爲他的輪換操作的回答,以及展示我舉一個例子。

根據他的建議,這是我的答案:

[A-Z0-9]{7}|[A-Z0-9][A-Z0-9-]{7} 

注:我測試了我的正則表達式here。 (只包括本供參考)

+1

這會認爲'0 ------'是有效的。 – jason 2009-11-15 05:36:16

+0

woops ..我不好。謝謝!嗯..我想知道如何解決它。 – sivabudh 2009-11-15 05:38:58

5

我想這應該這樣做:

/^[a-zA-Z0-9]{3}-?[a-zA-Z0-9]{4}$/ 

這3個字母或數字後面跟着一個可選連字符後面4個字母或數字匹配。這個以紅寶石工作。根據你使用的正則表達式引擎,你可能需要稍微修改它。

+0

我有一個問題..所以我測試了上述正則表達式,它工作正常。然而,當我添加更多的數字到最後,正則表達式驗證器仍然說它是有效的。這是爲什麼?當我添加1個字符時,該表達式是否應該失效?我在http://tools.netshiftmedia.com/regexlibrary/使用121333333 – sivabudh 2009-11-15 05:43:01

+0

+1進行測試以獲得簡單性 – 2009-11-15 05:44:05

+2

@ ShaChris23,因爲121333333在開始時也與它匹配。對於真正的全長匹配,它將是'/^[a-zA-Z0-9] {3} - ?[a-zA-Z0-9] {4} $ /'(使用'^'和' $'符號來表示字符串的開頭和字符串的結尾(分別)) – 2009-11-15 05:45:15

1

不知道這計數,但我打破它分爲兩個正則表達式:

#!/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})$/; 

這應該避免接受多個破折號,在錯誤的地方劃線,等等

1

假設你想讓連字符在任何地方,lookarounds將會對你有用。事情是這樣的:

^([A-Z0-9]{7}|(?=^[^-]+-[^-]+$)[A-Z0-9-]{8})$ 

有兩個主要部分,以這種模式:[A-Z0-9]{7}匹配一個連字符無弦和(?=^[^-]+-[^-]+$)[A-Z0-9-]{8}匹配一個連字符的字符串。

(?=^[^-]+-[^-]+$)將匹配任何帶有單個連字符的字符串(並且連字符不是第一個或最後一個字符),那麼[A-Z0-9-]{8}部分將計算字符並確保它們全都有效。

+1

注意:我在測試正則表達式後修改了我的答案。 – Artelius 2009-11-15 06:04:36

+1

哇,這真棒。謝謝! – sivabudh 2009-11-15 06:43:53