2017-07-21 60 views
1

我正在处理一个看似简单的问题,但似乎是一个恼人的正则表达式计算。在R/Shiny中搜索引擎风格的格式字符串

我正在设计一个闪亮的应用程序,它允许用户搜索数据库中的字符串并计算字符串匹配的数量。

从stringr包,我最终的调用是:

str_count(text, pattern=REGEX(user_input)) 

我的目标是将用户输入转换成合适的正则表达式 - 同时允许用户输入标准的搜索项格式的数据。

所以以下用户输入:

artist picasso "picasso painting" france 

应当形成以下正则表达式:

artist|picasso|picasso painting|france 

,其中溶液知道治疗“毕加索的画”作为一个词,由于报价。

任何帮助表示赞赏!

+0

请显示您到目前为止的代码。目前,您正在进行的任务的方方面面都不清楚:1)用户输入的要求是什么?它应该只是用空白分隔的条目与双引号内的单词代表一个项目?2)这只是纯文本或正则表达式模式? 3)会不会有字词? 4)你打算收集比赛,还是只计算发生的事件?这很重要,因为这里的'pic | pic'与'pic here'不匹配。 –

+0

谢谢你Wiktor。目前我的代码非常稀少,只需从Shiny的textInput函数中正确解析输入到str_count()即可。根据你的问题:1.是的。这只是用双引号内的单词表示的空格分隔的条目。是的,我需要非字词。 3.现在我不收集比赛,我只是在数它们。再次感谢。 – jsl2

+0

请在下面检查我的答案。 –

回答

2

这里是一个基础R溶液:

regex.escape <- function(string) { 
    gsub("([][{}()+*^${|\\\\?])", "\\\\\\1", string) 
} 

sort.by.length.desc <- function (v) v[order(-nchar(v)) ] 

s <- "artist picasso \"picasso (painting)\" france zoo" 
keys <- c(t(read.table(text=s, header=FALSE)))   # Read in the values 
keys <- sort.by.length.desc(keys)      # Sort the values 
pattern = paste(regex.escape(keys), collapse="|")  # Create the pattern 
## Test 
## cat(pattern, sep="\n")        # This shows the regex pattern 
txt <- "The artist was born in france and named picasso picasso (painting)" 
length(unlist(gregexpr(pattern, txt)))     # Count the number of occurrences 
[1] 4 

R demo。有4个匹配,因此输出是4

详细

  • regex.escape函数转义,一个正则表达式引擎可以将其解释为特殊字符
  • sort.by.length.desc订单的特征向量由特征向量长度的项目在一个下降的最重要的字符order
  • c(t(read.table(text=s, header=FALSE)))读取用户输入并作为字符向量存储在keys
  • pattern = paste(regex.escape(keys), collapse="|")创建具有交替运营商的图案(模样picasso \(painting\)|picasso|artist|france|zoocat(pattern, sep="\n")显示得到的图案作为一个文本字符串)
  • length(unlist(gregexpr(pattern, txt)))线计数使用基础R gregexpr函数匹配的发生。
0

使用"[^"]*"|\S+进行全局匹配将其分开。
盲目删除前后双引号^"|"$
将匹配推入数组中。
将数组排序最长(降序?)。
\\$1替换每个元素的元字符([\[$^()*+|{}-\\])
最后,将元素连同|一起加入。