2011-06-08 83 views
1

我想写一个正则表达式,它产生的内容不在括号或括号中的字符串。括号总是一年,括号中可以包含任何普通字符,大写和小写。我正想它通过查找括号和括号,然后按[^ \正则表达式]逃脱它红宝石正则表达式,一切,但括号和括号内是什么

这里的字符串(这是正确的?):

s = 'Some words (1999) [THINGS] 

和正则表达式:

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

,但是这包括里面的人物在括号中看到(http://rubular.com/r/bbpcnnGgCI)

一切正常,直到加入[^ \正则表达式]

例如,该工程获得(1999年):

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

和什么括号:

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

,但把它们放在一起使用|为“或”:

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

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

这是怎么回事?

我在这里做错了什么?

回答

5

试试这个/\(.+/这将匹配从开头(开始的所有内容。如果你把它拿出来,你就剩下'Some words'这应该是你需要的吗?

两点

  1. 我可能误解的问题
  2. 你需要的东西,如果有前面字符串中出现的(的可能性更加复杂。

顺便说一句,我觉得this相当有价值试图想出正则表达式模式时。即使在字符串中较早的一个流浪支架

编辑这种模式只应在括号匹配的东西。

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

@duckyfizz完美!和一个很好的资源。它与替换错误,但与gsub工作得很好。 – rick 2011-06-08 03:18:43

+0

对不起,我的意思是gsub。出于某种原因已经替换了我的头。 – 2011-06-08 03:21:44

+0

即时通讯将不得不在这一点上工作,因为我也有没有括号或括号的字符串,并且当它在这些字符串上运行时,它会将其擦除(nil)。有任何想法吗? – rick 2011-06-08 03:52:56

0

怎么样从相反的方向看这个:尝试空白""更换模式\(\d{4}\),那么你就会有你想要什么:

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

编辑:要结合语法修正通过@建议rick(thx @rick!)

+0

是这样的? http://rubular.com/r/mFSfx2wIez似乎给我的一切,但实际的括号和括号,我不想要他们的内容。 – rick 2011-06-08 03:07:02

+0

哦,我明白你在说什么了。使用gsub即时通讯得到相同的结果,没有任何改变,但我看到你要去哪里... >> s.gsub(“\(\ d {4} \)”,“”) =>“艺术家的名字1999)[FLAC]“ – rick 2011-06-08 03:09:47

+0

@rick:请注意括号被转义,即\(\ d {4} \) - 不是(\ d {4}),如您的评论 – Bohemian 2011-06-08 03:25:28

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)的方法工作得很好。

+0

我明白你在说什么。因为没有明确的“匹配所有东西但是这个”,而是将其分开,然后明确调用数组的元素。非常有意义。感谢你打破了正则表达式,我觉得它越来越长,我开始失去了我在做什么的意义:) – rick 2011-06-08 03:51:39

+0

你可能会发现它有助于编写粘合正则表达式的函数。例如(在Python中):'def regex_any(* x):return'(%s)'%'|'.join(x)'。或者使用/ x正则表达式标志。 – 2011-06-08 03:53:32

+0

即时开始看到/ x标志可能会帮助我们新regrex的。谢谢! – rick 2011-06-08 04:19:41

相关问题