【问题标题】:Regex (ICU) for matching between parentheses用于括号之间匹配的正则表达式(ICU)
【发布时间】:2017-01-08 06:17:13
【问题描述】:

寻找一些正则表达式,它将为括号内出现的单词创建一个捕获组,忽略括号本身。正则表达式必须是 PCRE 或 ICU。

输入:( lakshd asd___ asa1123 Name : _____)

所需输出:Name

我尝试过的:

\\((Name|name|NAME)\\)

(?<=\\()name|Name|NAME(?=\\))

\\(name|Name|NAME\\)

【问题讨论】:

  • 什么意思?您试图删除括号内的Name?我不明白寻找已知单词并保留它的意义,这与声明变量并为其赋值相同。无论如何,您正在做的事情可以通过str_match(s, "(?i)\\([^()]*\\b(Name)\\b[^()]*\\)") 找到
  • 你也会有嵌套层次的括号吗?
  • 在任何情况下你都没有(Name)。我认为您可以使用 \\(.*(Name|name|NAME).*\\) 我不知道 r 但那里不仅有 containsstrpos 功能。
  • @revo 不需要嵌套括号

标签: regex r pcre icu


【解决方案1】:

我尝试过的:

\\((Name|name|NAME)\\)
(?<=\\()name|Name|NAME(?=\\))
\\(name|Name|NAME\\)

所有这些模式都在 nameNameNAME 之前有一个 ( immediately) right 之后,有区别作为匹配项捕获或返回的内容。要匹配括号内的某个单词,您需要在需要获取的值之前使用\([^()]*,在它之后使用[^()]*\)

另外,提取你已经知道的东西是没有意义的。

因此,如果您打算从括号中提取最后一个单词,您可以使用

> library(stringr)
> s = "( lakshd  asd___ asa1123 Name : _____)"
> res <- str_match(s, "(?i)\\([^()]*\\b([a-z]\\w*)\\b[^()]*\\)")
> res[,2]
[1] "Name"

注意str_match 允许访问捕获的 值。

(?i)\\([^()]*\\b([a-z]\\w*)\\b[^()]*\\) 模式匹配括号和其中的最后一个完整单词。

【讨论】:

  • 以这种方式提取是有道理的,但这超出了问题的范围,我不需要帮助
【解决方案2】:

如果嵌套级别的括号不太可能发生,那么查看当前位置是否将在末尾后面跟着一个右括号,而左括号应该已经打开了(适用于 ICU 和PCRE):

(Name|name|NAME)(?=[^()]*\))

PCRE live demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多