2010-08-17 33 views
2

我在Ruby中工作,必須爲以下任務創建單個正則表達式,因爲我正在使用其他人的gem,它使用此正則表達式來匹配要在文本文件中處理的字段。我需要匹配字符串的開頭,任何字符集和下劃線,然後是不是1,2,9或10的任何多位整數,以及字符串的結尾。
也就是說,我想下面的匹配:如何創建一個匹配除Ruby中的某些字符串之外的模式的正則表達式?

foo_4 
bar_8 
baz_120 

BUT NOT:

foo_1 
bar_9 
baz_10 

我試圖

/^.+_(^(1|2|9|10))$/ 

,但沒有奏效因爲顯然^唯一的 「否定」 字在括號中,而不是子匹配。

+1

你好。由於這是你在Stack Overflow上的第一個問題,所以我編輯它看起來像一個在這裏被認爲是「寫得很好」的問題。請嘗試用更通用的單詞來描述您的問題(查看我寫的標題),以便其他人可以搜索您的問題並在遇到同樣問題時重新使用。另外,請注意格式化(閱讀技巧並點擊編輯頁面的'?'),因爲良好的格式是成功的關鍵。換句話說,歡迎來到SO! – 2010-08-17 18:27:41

+0

您的意思是「匹配**字符串**的開頭」或「匹配**行**的開頭」。如果輸入可以包含新行,則會有所不同。 – 2010-08-18 10:41:31

+0

所以,結尾整數必須是多位的,對嗎?如果是這樣的話,那麼你不需要檢查1,2或9,我會想。我試圖找到寫表達式,但我是正則表達式的newby。編輯:從不知道,當我完成這個你已經編輯你的文章。 :) – XstreamINsanity 2010-08-17 18:25:35

回答

5

在字符類外面,^符號表示行的開始。我想你想一個negative lookahead代替:

/^.+_(?!(?:1|2|9|10)$)\d+$/ 

看到它在行動上rubular

+3

'^'表示行的開始,而不是字符串的開始。 '\ A'表示字符串的開頭。 – 2010-08-17 18:40:29

+3

沒有。無論是否使用'm'標誌來執行多行匹配,總是**表示行開始。只有在確定所匹配的字符串中沒有換行符時,您才能忽略差異。 – 2010-08-17 21:39:14

+0

@Ken Bloom:對不起,你是對的 - 我檢查和Ruby中它始終意味着行首(在大多數其他正則表達式引擎^意味着字符串的開始,我認爲Ruby是相同的)。我修復了我的帖子。感謝你的執着! – 2010-08-17 21:49:26

相關問題