Ruby重复值与regexp匹配,但更智能,然后向前看

Ruby重复值与regexp匹配,但更智能,然后向前看,regex,ruby,Regex,Ruby,我有一个字符串,比如: (:a100:b(300400500“你好”):c“你好”) 理想情况下,我需要匹配如下组: “:a”、“100” “:b”,“300 400 500\”你好“ :c“你好” 正如您所看到的,这是一个简单的键值匹配,类似于免费的lisp代码 我尝试了许多regexp模式,比如:(:\w+)(?:\w+),但这对我没有多大帮助 完整模式描述: regexp适合这种类型的解析吗?还是我应该只编写简单的解析器/使用就绪的解析器 str = '(:a 100 :b (300 4

我有一个字符串,比如:

(:a100:b(300400500“你好”):c“你好”)
理想情况下,我需要匹配如下组:

“:a”、“100”

“:b”,“300 400 500\”你好“

:c“你好”

正如您所看到的,这是一个简单的键值匹配,类似于免费的lisp代码

我尝试了许多regexp模式,比如:
(:\w+)(?:\w+)
,但这对我没有多大帮助

完整模式描述:

regexp适合这种类型的解析吗?还是我应该只编写简单的解析器/使用就绪的解析器

str = '(:a 100 :b (300 400 500 "hello") :c "hello")'

这并不是我们想要的,因为括号保留在
“(300 400 500 \“hello\”)
中。这可以在单独的步骤中处理

arr.map { |a,b| [a, b.gsub(/\A\(|\)\z/, '')] }
  #=> [[":a", "100"],
  #    [":b", "300 400 500 \"hello\""],
  #    [":c", "\"hello\""]]
我们可以在自由间距模式下编写正则表达式,使其能够自我记录:

/
(           # begin capture group 1 
  :         # match ':'
  \p{Ll}+   # match 1+ lower case Unicode letters
)           # end capture group 1
\s+         # match 1+ whitespaces
(           # begin capture group 2
  [^(\s]+   # match 1+ chars other than '(' and whitespace
  |         # or
  \(        # match a left paren
  [^)]+     # match 1+ chars other then ')'
  \)        # match ')'
)           # end capture group 2
/x          # free-spacing regex definition mode

您是否正在尝试解析类似于反向波兰符号的东西?如果是的话,正则表达式是不够的(阅读常规语法与上下文无关语法);你需要一个合适的解析器。如果限制括号嵌套深度,可以使用正则表达式,但必须为每个支持的深度添加一个子句。Ragel可能是一个很好的起点。@ChrisHeald是正确的。您可能应该编写一个小型解析器,修改现有的解析器,或者尝试将字符串修改为已知格式(例如JSON)。它留给读者的任务是试图找出实际问题。我在回答中做了一些假设,但从你的链接中我发现它们是不正确的。我只能猜测你在想什么。至少,您需要为在链接中给出的示例字符串显示所需的返回值。如果
str
持有该测试字符串,
str.count'(''#=>33;str.count')'.=>19
,这意味着括号是不平衡的,这使得确定所需的返回值变得更具挑战性。不过,它看起来并不像所需的输出,不是吗?@Eric,我看不出有问题。¯\_(ツ)_/¯
/
(           # begin capture group 1 
  :         # match ':'
  \p{Ll}+   # match 1+ lower case Unicode letters
)           # end capture group 1
\s+         # match 1+ whitespaces
(           # begin capture group 2
  [^(\s]+   # match 1+ chars other than '(' and whitespace
  |         # or
  \(        # match a left paren
  [^)]+     # match 1+ chars other then ')'
  \)        # match ')'
)           # end capture group 2
/x          # free-spacing regex definition mode