2012-03-29 65 views
-5

正則表達式應該允許所有其他數字。 感謝如何創建一個正則表達式來排除2,102和103

+0

我只是匹配所有的數字,然後明確地檢查是否匹配的數字是任何這些。 (另外,SO精神上有點過分。) – Corbin 2012-03-29 00:53:57

+0

* Re:關閉問題。*這個問題並不含糊或以任何方式含糊不清。不要關閉你不瞭解的東西。 – Kaz 2012-03-30 06:06:10

+0

Kaz:它[根據堆棧溢出網站常見問題]不完整(http://stackoverflow.com/faq#close)。 [提出一個好問題的指導方針](http://stackoverflow.com/questions/how-to-ask)指出之前要做一些研究並展示迄今的進展。這在上面的問題中是看不到的,downvotes /最終關閉是合理的。 – daxim 2012-03-30 06:40:00

回答

2

你用牙籤砍倒一棵樹,或者用正則表達式解析XML或COBOL編寫的操作系統,或做任何事情帕斯卡爾:-)

你不要用同樣的方法「T。你使用正確的工具的工作,這將是這樣的(僞代碼):

if val = 2 or val = 102 or val = 103: 
    return 
# Process other values. 
+0

爲什麼你會回答「你能做我的工作嗎?」 196k聲望隊友的問題?我喜歡你的觀點和pascal評論 – kommradHomer 2012-03-30 09:25:44

1

這是簡單得多,允許任何數字,然後排除你不想正則表達式以外的人。

while (/([0-9]+)/g) { 
    next if $1 == 2 || $1 == 102 || $1 == 103; 
    say $1; 
} 

但它可以做到。

1.複雜圖案,

/ 
    ... 
    (?<![0-9]) # Possible to omit in some circumstances. 
    (
     (?: 0 
     | [3-9][0-9]* 
     | 2[0-9]+ 
     | 1(?:[1-8][0-9]*)? 
     | 10([014-9][0-9]*)? 
     | 10[23][0-9]+ 
    ) 
    ) 
    (?![0-9]) # Possible to omit in some circumstances. 
    ... 
/xg 

2.嵌入Perl代碼到圖案

/ 
    ... 
    (?<![0-9]) # Possible to omit in some circumstances. 
    ([0-9]+) 
    (?![0-9]) # Possible to omit in some circumstances. 
    (?(?{ $^N == 2 || $^N == 102 || $^N == 103 })(?!)) 
    ... 
/xg 

3.負先行

/ 
    ... 
    (?<![0-9]) # Possible to omit in some circumstances. 
    (?!(?:2|102|103)(?![0-9])) 
    ([0-9]+) 
    ... 
/xg 

棘手的部分是使當然,

  • 20場比賽
  • 102沒有得到匹配的爲10
+0

@ user1299558,我加入到我的答案。 – ikegami 2012-03-29 01:42:49

0

嗯,你的意思是得到一個數,每行,扔掉那些是「2」,等等?

if ($a =~ /^(\s)*(10)?([23])(\s*)$/ || $a =~ /^(\s)*(2)(\s)*$/) 
    { 
       #bad string! do whatever 
    } 
else 
    { 
       #good string! 
    } 

這符合

2 
102 
103 

也就是說,只有你的 「壞」 的數量,也許一些空格線。 「111103444」,被認爲是「好一些」,所以如果你的意思是過濾掉你的壞號碼嘗試像

$a =~ s/^(?:102|103|2)$//g; 

這可能不是在技術上是一個純粹的正則表達式...

爲什麼有人說不使用Perl的正則表達式?

+0

我沒有說你不應該使用Perl的正則表達式,我表示你不應該使用正則表達式來完成這個任務。你的怪胎是爲什麼:-) – paxdiablo 2012-03-29 02:58:57

+0

@paxdiablo什麼怪物? – tchrist 2012-03-29 19:07:59

1

真正則表達式編譯到一個NFA/DFA:

length 1:

[0-13-9] 

length 2:

[0-9][0-9] 

length 3:

[02-9][0-9][0-9] 

    10[0-14-9] 

    1[1-9][0-9] 

length 4 or more:

[0-9][0-9][0-9][0-9]+ 

combine:

[0-13-9]|[0-9][0-9]|[02-9][0-9][0-9]|10[0-14-9]|1[1-9][0-9]|[0-9][0-9][0-9][0-9]+ 

grep line for validation:

grep -E '^([0-13-9]|[0-9][0-9]|[02-9][0-9][0-9]|10[0-14-9]|1[1-9][0-9]|[0-9][0-9][0-9][0-9]+)$'