[英]Combine regex 'or' with stop at first occurence
从概念上讲,我想搜索(a|b)
并仅获得第一个匹配项。 我知道这是一个懒惰/非贪婪的应用程序,但似乎无法将其与or
正确组合。
超出概念级别,这可能会改变很多事情, a
和b
实际上是更长的模式,但是它们已经过单独测试并且可以正常工作。 我正在从gsubfn
包中打包使用它, strapply
从本质上找到了所有匹配项。
我怀疑答案就在某个地方,但是很难找到这样的东西。
详细信息:我正在尝试查找函数表达式var functionName = function(...)
和函数声明function functionName(...)
并在javascript
提取函数的名称(使用R
解析行)。 a
是\\\\s*([[:alnum:]]*)\\\\s*=*\\\\s*function\\\\s*\\\\([^d|i]
, b
是\\\\s*function\\\\s*([[:alnum:]]+)\\\\s*\\\\([^d|i]
。它们可以单独工作。单个函数定义将采用一种形式或另一种形式,因此当出现以下情况时,我需要停止搜索我找到一个。
编辑:在此字符串中Here is a string of blah blah blah
我想仅使用(a|b)
或仅使用(b|a)
来查找第一个'a',当然还要加上正则表达式好东西,我想念。
编辑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))
他们按顺序返回:
[1] "brushed" "brushed"
[1] "activateBrush" "followMouse" "activateBrush" "followMouse"
我想做的是同时使用这两种模式。 我试过的是
fnPat3 <- paste("((", fnPat1, ")|(", fnPat2, "))") # which is (a|b) of the orig. question
但这又回来了
[1] " activateBrush = function() " " function brushed() "
我想要的是所有函数名称的向量,即c("brushed", "activateBrush", "followMouse")
重复很好,我可以调用unique
。
也许现在情况更清楚了,也许有人看到了完全不同的方法。 感谢大家!
要匹配第一个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"
使用sub
功能检查正则表达式是否与第一个a
, b
匹配。 在下面,我使用子函数首先用***
替换a
或b
。 我们在这里使用sub
的优势,即它不会做全局替换。 它仅替换与给定模式或正则表达式匹配的字符的首次出现。
> 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"
我们也可以使用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"
说明:
^
断言我们是开始。 [^ab]*
,否定的字符类,与任何字符匹配,但不匹配a
或b
零次或多次。 我们不使用[^ab]+
因为在行的开头可能会出现a
或b
。 \\K
丢弃先前匹配的字符。 即,它从打印中删除所有与[^ab]*
正则表达式匹配的字符。 [ab]
现在,它与以下a
或b
相匹配 从stringr
包尝试str_extract()
。
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"
在我看来,将这些表达式组合起来会容易得多...
strapply(lines, '(?:var|function)\\s*([[:alnum:]]+)', simplify = c)
# [1] "activateBrush" "brushed" "followMouse"
(?: ... )
是一个非捕获组 。 通过将?:
放在内部,您可以指定不捕获组,而是将事物分组。 说, 分组但不捕获 “ var”或“ function”,然后捕获其后的单词字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.