Regex 组合正则表达式';或';第一次出现就停止
从概念上讲,我想搜索Regex 组合正则表达式';或';第一次出现就停止,regex,r,Regex,R,从概念上讲,我想搜索(a | b),只得到第一个匹配项。我知道这是一个懒惰/不贪婪的应用程序,但似乎无法将其与或正确结合 在概念层面之外,a和b实际上是更长的模式,但它们已经分别进行了测试,效果良好。我在包gsubfn中的strapply中使用了它,它本质上查找所有匹配项 我怀疑答案就在这里的某个地方,但很难找到这样的东西 详细信息:我正在尝试查找函数表达式var functionName=function(…)和函数声明function functionName(…),并在javascript
(a | b)
,只得到第一个匹配项。我知道这是一个懒惰/不贪婪的应用程序,但似乎无法将其与或正确结合
在概念层面之外,a
和b
实际上是更长的模式,但它们已经分别进行了测试,效果良好。我在包gsubfn
中的strapply
中使用了它,它本质上查找所有匹配项
我怀疑答案就在这里的某个地方,但很难找到这样的东西
详细信息:我正在尝试查找函数表达式var functionName=function(…)
和函数声明function functionName(…)
,并在javascript
中提取函数名(使用R
解析行)<代码>a
是\\s*([[:alnum:]]*)\\s*=*\\s*函数\\s*\([^d | i]
和b
是\\s*函数\\s*([:alnum:]+)\\s*\\([^d | i]
。它们可以单独工作。单个函数定义会采用一种形式或另一种形式,因此找到一种形式时我需要停止搜索
编辑:在这个字符串中,这里有一串诸如此类的废话
我只想找到使用(a | b)
的第一个“a”或使用(b | a)
的第一个“b”,当然还有我缺少的任何正则表达式
编辑2:非常感谢所有看过这篇文章的人。细节非常重要,所以我将发布更多信息。以下是我正在搜索的测试行:
dput(lines)
c("var activateBrush = function() {", " function brushed() { // Handles the response to brushing",
" var followMouse = function(mX, mY) { // This draws the guides, nothing else",
".x(function(d) { return xContour(d.x); })", ".x(function(i) { return xContour(d.x); })"
)
下面是我想要使用的两种模式,以及我如何分别使用它们
fnPat1 <- "\\s*function\\s*([[:alnum:]]+)\\s*\\([^d|i]" # conveniently drops 'var'
fnNames <- unlist(strapply(pattern = fnPat1, replacement = paste0, X = lines))
fnPat2 <- "\\s*([[:alnum:]]*)\\s*=*\\s*function\\s*\\([^d|i]" # conveniently drops 'var'
fnNames <- unlist(strapply(pattern = fnPat2, replacement = paste0, X = lines))
我想做的是同时使用这两种模式
fnPat3 <- paste("((", fnPat1, ")|(", fnPat2, "))") # which is (a|b) of the orig. question
我想要的是一个所有函数名的向量,即c(“刷”、“activateBrush”、“followMouse”)
重复项很好,我可以调用unique
也许现在这更清楚了,也许有人看到了完全不同的方法。谢谢大家!尝试stru extract()
fromstringr
软件包
str_extract("b a", "a|b")
[1] "b"
str_extract("a b", "a|b")
[1] "a"
str_extract(c("a b", "b a"), "a|b")
[1] "a" "b"
要匹配第一个a
或b
> x <- "Here is a string of blah blah blah"
> m <- regexpr("[ab]", x)
> regmatches(x, m)
[1] "a"
> x <- "Here b is a string of blah blah blah"
> m <- regexpr("[ab]", x)
> regmatches(x, m)
[1] "b"
我们也可以使用gregexpr
或gsub
函数
> x <- "Here is a string of blah blah blah"
> m <- gregexpr("^[^ab]*\\K[ab]", x, perl=TRUE)
> regmatches(x, m)
[[1]]
[1] "a"
> gsub("^[^ab]*\\K[ab]", "***", x, perl=TRUE)
[1] "Here is *** string of blah blah blah"
> x <- "Here b is a string of blah blah blah"
> gsub("^[^ab]*\\K[ab]", "***", x, perl=TRUE)
[1] "Here *** is a string of blah blah blah"
>x m regmatches(x,m)
[[1]]
[1] “a”
>gsub(“^[^ab]*\\K[ab]”,“***”,x,perl=TRUE)
[1] “这是***串废话废话”
>x gsub(“^[^ab]*\\K[ab]”,“***”,x,perl=TRUE)
[1] “这里***是一串废话废话”
说明:
^
断言我们处于起点
[^ab]*
,与任何字符匹配但不匹配a
或b
的求反字符类零次或多次。我们不使用[^ab]+
,因为有可能在行首出现a
或b
\K
丢弃以前匹配的字符。即,它从打印中删除所有与[^ab]*
正则表达式匹配的字符
[ab]
现在它匹配以下a
或b
在我看来,将这些表达式组合起来会容易得多
strapply(lines, '(?:var|function)\\s*([[:alnum:]]+)', simplify = c)
# [1] "activateBrush" "brushed" "followMouse"
(?:…)
是一个。通过将?:
放置在内部,您可以指定组不是要捕获的,而是要对事物进行分组。也就是说,组但不捕获“var”或“function”然后捕获后面的单词字符。匹配的字符串将作为中的后向引用。因此,当我说查找第一个“a”时,它将在parens:(a)
中作为后向引用。在\\s*([:alnum:]*)\\s*=\\s*函数\\s*\([^d | I]
我将提取([[:alnum:][]*)
作为背景参考。我希望这是清楚的。这可能会起作用。我将进行实验,这将需要一段时间。谢谢你。谢谢你阿维纳什。我将研究你的建议。你使用的最后一个例子是gsub
,它有可能被集成到我需要的Straply
方法中。你能带我看看gr吗egexpr(“^[^ab]*\\K[ab]”,x,perl=TRUE)
?我的正则表达式技能有限。^[^ab]
意味着找到一行行号,它不是以a或b开头(我想),而是以\\K[ab]
magic我不懂,可能是因为我不懂perl游戏。谢谢。我不是从我这里学来的,我仍然在努力学习它!谢谢,我几乎晕过去了,因为它太简单了。但是,唉,在我的实际情况下,它不太管用,因为“a”和“b”实际上是更长的字符串。我将用更详细的细节来编辑这个问题。谢谢你r兴趣!神圣的烟熏!显然我的正则表达式技能很差劲。你能把(?:var | function)
用文字表达出来吗?谢谢你提供的额外信息!我将吸入这些非常有用的信息;-)快速澄清-(?:var | function)
意味着不捕获,而是搜索这些单词,或者是执行\\s*([[:alnum:][]+)
,然后删除var和function(如果在结果中找到它们的话)?正确,第一个…我将看一看分组工作的结构。
> x <- "Here is a string of blah blah blah"
> sub("[ab]", "***", x)
[1] "Here is *** string of blah blah blah"
> x <- "Here b is a string of blah blah blah"
> sub("[ab]", "***", x)
[1] "Here *** is a string of blah blah blah"
> x <- "Here is a string of blah blah blah"
> m <- gregexpr("^[^ab]*\\K[ab]", x, perl=TRUE)
> regmatches(x, m)
[[1]]
[1] "a"
> gsub("^[^ab]*\\K[ab]", "***", x, perl=TRUE)
[1] "Here is *** string of blah blah blah"
> x <- "Here b is a string of blah blah blah"
> gsub("^[^ab]*\\K[ab]", "***", x, perl=TRUE)
[1] "Here *** is a string of blah blah blah"
strapply(lines, '(?:var|function)\\s*([[:alnum:]]+)', simplify = c)
# [1] "activateBrush" "brushed" "followMouse"