繁体   English   中英

将正则表达式“或”与首次出现时停止一起使用

[英]Combine regex 'or' with stop at first occurence

从概念上讲,我想搜索(a|b)并仅获得第一个匹配项。 我知道这是一个懒惰/非贪婪的应用程序,但似乎无法将其与or正确组合。

超出概念级别,这可能会改变很多事情, ab实际上是更长的模式,但是它们已经过单独测试并且可以正常工作。 我正在从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

也许现在情况更清楚了,也许有人看到了完全不同的方法。 感谢大家!

要匹配第一个ab

> 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功能检查正则表达式是否与第一个ab匹配。 在下面,我使用子函数首先用***替换ab 我们在这里使用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"

我们也可以使用gregexprgsub函数。

> 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]* ,否定的字符类,与任何字符匹配,但不匹配ab零次或多次。 我们不使用[^ab]+因为在行的开头可能会出现ab
  • \\K丢弃先前匹配的字符。 即,它从打印中删除所有与[^ab]*正则表达式匹配的字符。
  • [ab]现在,它与以下ab相匹配

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM