2016-04-28 92 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

相关问题