2016-04-28 81 views
2

我想在R中編寫正則表達式來驗證用戶輸入並相應地運行程序。 預計有3種類型的查詢,都是字符向量。在R中驗證輸入字符串的正則表達式

query1 = "Oct4[Title/Abstract] AND BCR-ABL1[Title/Abstract] 
     AND stem cells[Title] AND (2000[PDAT] :2015[PDAT])" 
query2 <-c("26527521","26711930","26314551") 

以下代碼有效。但面臨的挑戰是在兩種情況下

all(grepl("[A-Za-z]+",query,perl=TRUE)) validates False for query 2 

或@sebkopf建議限制特殊字符

all(grepl("^[0-9 ,]+$", query)) # evaluates to TRUE only for query 2 

然而,查詢1也需要在一年的輸入,這意味着它的數字輸入應該被接受查詢1.爲了增加複雜性,在query1中允許使用space , . - []()。而且,查詢2的格式應該只是數字,用, or space分隔。其他任何事情都應該拋出一個錯誤。
如何將這兩個條件合併爲R正則表達式的一部分?那麼,下面的if conditions被驗證相應地運行相應的代碼?

if (grepl("regex for query 1& 2",query,perl=TRUE) == True { 
Run code 1 
} else { print ("these characters are not allowed @ ! & % # * ~ `_ = +") } 
if (grepl("regex for query3",query,perl=TRUE) == True { 
Run code 2 
} else { print ("these characters are not allowed @ ! & % # * ~ `_ = + []() - . ")} 
+3

什麼是你的問題? – simbabque

+0

對不起,監督。尋找解決方案,將允許一些特殊字符和限制其他? – user5249203

+2

然後請刪除多餘的內容,只保留與問題相關的內容。而[MVCE(最小完整的可驗證示例)](http://stackoverflow.com/help/mcve)會很有幫助。 –

回答

1

在當前的正則表達式,你只是在查詢模式("[A-Za-z]+"任何地方的發生。如果您想專門僅允許某些字符模式,則需要使用"^...$"確保它在整個查詢中匹配。

使用正則表達式有做什麼,但對於匹配查詢,而具體的特殊字符(但一切允許的),你可以使用下面的(這裏,裹在all考慮到您的query3存在提供了一個例子始終多種方式矢量):

all(grepl("^[^@!&%#*~`_=+]+$", query)) # evaluates to TRUE for your query1, 2 & 3 

有關,而不是做積極的匹配是數字加空格和逗號唯一的缺點查詢:

all(grepl("^[0-9 ,]+$", query)) # evaluates to TRUE only for query3 
+0

謝謝你的解決方案。第二部分非常適合查詢3格式。但是,我不想對所有3個(代碼的第一部分)都進行評估。如果你檢查'if condition語句'如果它是一個query3格式,我需要運行一個不同的代碼。所以,只有一個正則表達式只針對查詢1和2是正確的。謝謝 – user5249203

+0

兩個嵌套的if語句如何? (所有(grepl(「^ [^ @!&%#*〜_ = +] + $」,query))){if(all(grepl(「^ [0-9,]) +「,query))){print(」query3「)} else {print(」query1 and 2「)}} else {print(」not allowed「}' – sebkopf

相關問題