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()
from
stringr
软件包

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"