2013-04-17 130 views
0

我要尋找一個正則表達式以下條件:尋找一個正則表達式

輸入 - 字符串的長度

輸出 - 如果字符串包含正好2個大寫字符或字符串只包含2返回true數字。

真正情形

SS22

S5834534P

1ffgdfjdfS2

假案

123SSS

SSSSSS

+++ 1 ++++ 1 ++++ 3

感謝您的幫助。

+3

你的努力在哪裏?你使用什麼語言或工具? – squiguy

+0

我們知道如何處理個案(2位數字,2個大寫字母),但不知道如何考慮OR條件。我們正在使用C#。謝謝。 – VVV

+1

(2DIGITS | 2UPPER) –

回答

1
egrep '^(([^A-Z]*[A-Z][^A-Z]*[A-Z][^A-Z]*)|([^0-9]*[0-9][^0-9]*[0-9][^0-9]*))$' test.txt 

的想法是,如果你想找到正好兩個字符的比賽,你需要找到字符串:

  • 開始
  • 0以上錯誤字符(例如,不數字)
  • 正好需要一個字符(數字)
  • 0或更多錯誤字符(非數字)
  • 正好一個所需的字符(數字)
  • 0以上字符(不位數)
  • 結束

EDIT

較短的形式:

egrep '^(([^A-Z]*([A-Z][^A-Z]*){2})|([^0-9]*([0-9][^0-9]*){2}))$' test.txt 
+0

謝謝hudolejev!這種情況下修改的表達式是什麼:或者是2位數字,或者是2位大寫字符串,但不是兩種情況。例如 - 22SS無效,因爲兩個條件都是真的。 22SSS有效,因爲只有1個條件成立。 – VVV

+0

'(^([^ AZ] *([AZ] [^ AZ] *){2} $)|(^ [^ 0-9] *([0-9] [^ 0-9] *){ 2})$)'將您的字符串邊界移動到每個子表達式。 –

+1

這裏你需要的是'XOR'而不是'OR'。從理論上講,這可以通過從一組全部匹配中減去* digit - **和** - letter *匹配的子集來實現。至於這個正則表達式,'OR'很容易,但'AND'很難。我會在兩次運行中執行它:第一次是上面給出的,第二次是'egrep'^([^ A-Z] *([A-Z] [^ A-Z] *){2})$'test.txt | egrep'^([^ 0-9] *([0-9] [^ 0-9] *){2})$''<<這將給你所有包含兩個字母和兩個數字的行。你必須從第一組比賽中排除這些。對不起,在C#線程中Bash特有的(: – hudolejev