ruby正则表达式,一切但是括号和括号中的内容

时间:2011-06-08 02:58:42

标签: ruby regex

我正在尝试编写一个正则表达式,用于生成不在括号或括号中的字符串中的内容。括号总是一年,括号可以包含任何普通字符,大写和小写。我通过查找括号和括号然后[^ \ regex]来逃避它(这是对的吗?)

这是字符串:

s = 'Some words (1999) [THINGS]

和正则表达式:

/[^(\(\d{4}\))|\[.*\]]/

但这包括括号内的字符(http://rubular.com/r/bbpcnnGgCI)

在添加[^ \ regex]

之前一切正常

例如,这可以得到(1999):

>> puts s.match(/\(\d{4}\)/)
(1999)  

以及括号中的内容:

>> puts s.match(/\[.*\]/)
[THINGS]

但是使用|将它们放在一起为“或”:

>> puts s.match(/\(\d{4}\)|\[.*\]/)
(1999)

...它只是匹配括号及其内容。

这里发生了什么?

我在这里做错了什么?

4 个答案:

答案 0 :(得分:5)

试试这个/\(.+/,它将与开场(之后的所有内容相匹配。如果你把它剥离出去,你就会留下'Some words'这应该是你需要的东西吗?

两点

  1. 我可能误解了这个问题
  2. 如果字符串中有(出现的可能性,则需要更复杂的内容。
  3. 顺便说一句,我发现this在尝试提出正则表达式模式时非常有价值。

    编辑这个模式应该只匹配括号中的内容,即使字符串中有一个迷路括号。

    string.gsub(/(\(|\[).+(\)|\])/, '')
    

答案 1 :(得分:3)

(\(\d{4}\))|\[.*\]表示“括号中包围的四个数字,也在一个组中捕获;或方括号之间的任何内容”。

[^...] 表示“...未匹配的任何内容”。 []设置了一个字符集,如果它以^开头,则会被取消。 [^(\(\d{4}\))|\[.*\]]表示“不是开括号或开括号或数字或开括号或4或近括号或近括号或近括号或管道或开方括号的字符或一个句号或一个星号或一个近似方括号“。

您希望匹配“不在括号或括号中的任何文本”。这不容易直接表示为正则表达式。你真正想做的是使用“任何带括号或括号的项目”作为分隔符拆分字符串。

我不知道ruby语法,但在Python中看起来像:

import re

pattern = re.compile(r"(?:\[[^\]]*\])|(?:\(\d{4}*\))")

pattern.split('Some words (1999) [THINGS]') # ['Some words ', ' ', '']

假设您需要它们,那将为您提供单独的碎片。如果您只是想再次加入它们,那么“用空字符串替换分隔符”(即gsub)方法就可以了。

答案 2 :(得分:0)

从相反的方向看这个:尝试用空白\(\d{4}\)替换模式"",然后你会得到你想要的东西:

s.gsub("\(\d{4}\)", "")

已编辑:要合并@rick建议的语法修正(thx @rick!)

答案 3 :(得分:0)

如果你需要匹配字符串中多个括号的东西,那么这将有效http://rubular.com/r/rvcO4TyBLq

((\(\d{4}\))|(\[[^\]]+\]))+