【问题标题】:Detect opening and closing brackets检测打开和关闭括号
【发布时间】:2018-06-15 21:10:37
【问题描述】:

从一个字符串:

"(book(1:3000))"

我需要排除左括号和右括号并匹配:

"book(1:3000)"

使用正则表达式。

我试过这个正则表达式:

/([^',()]+)|'([^']*)'/

检测除括号外的所有字符和整数。此正则表达式检测到的字符串是:

"book 1:3000"

是否有任何正则表达式忽略左括号和右括号,并给出整个字符串?

【问题讨论】:

  • 为什么这个标签是ruby-on-rails
  • @Amadan 希望 Rails 提供一些魔力,比如专门的方法可以做到这一点?
  • 如果你能提供一些 context 可能会有所帮助。例如,那个字符串代表什么,它来自哪里,book(...) 是什么(看起来像一个函数调用),1:3000 是什么,你想要匹配的模式是什么(解释它或展示一些例子) , 你感兴趣的子字符串周围总是有一对额外的括号吗?
  • 如果您的数据始终如一,您可以使用new_str = str[1..-2]new_str = str.start_with?('(') ? str[1..-2] : str 而不是正则表达式黑魔法。

标签: ruby regex


【解决方案1】:

构建明确说明您要提取的内容的正则表达式:字母数字,后跟左括号,后跟数字,后跟冒号,后跟数字,后跟右括号:

'(book(1:3000))'[/\w+\(\d+:\d+\)/]
#⇒ "book(1:3000)"

【讨论】:

  • 不,先生,它不工作。这是测试的regex的链接http://rubular.com/r/RipuLVfSXy
  • 当然可以。该链接包含一些与我提供的正则表达式无关的废话。
  • @ThananjayaChakravarthy 方括号属于method,而不是正则表达式。它是str[regexp],其中str'(book(1:3000))'regexp/\w+\(\d+:\d+\)/。这是一个工作示例:rubular.com/r/7UpYX5ijQS
【解决方案2】:
"(book(1:3000))"[/^\(?(.+?\))\)?/, 1]
=> "book(1:3000)"
"book(1:3000)"[/^\(?(.+?\))\)?/, 1]
=> "book(1:3000)"

正则表达式分成多行以便于阅读:

/
 ^      # start of string
  \(?   # character (, possibly (?)
  (     # start capturing
    .+? # any characters forward until..
    \)  # ..a closing bracket
  )     # stop capturing
/x      # end regex with /x modifier (allows splitting to lines)

1。在字符串的开头寻找可能的( 并忽略它。 2.开始抓拍 3. 捕获直到并包括第一个)

但这就是失败的地方:

"book(1:(10*30))"[/^\(?(.+?\))\)?/, 1]
=> "book(1:(10*30)"

如果您需要类似的东西,您可能需要使用递归正则表达式作为 在another stackoverflow answer 中描述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2018-07-22
    相关资源
    最近更新 更多