2012-01-19 38 views
2

我不幸徘徊到我需要使用Ruby的正则表达式的情况。基本上我想在下划线和第一个括号之前匹配这个字符串。所以最终的结果将是'食盐'。“富”和“酒吧”之间的Ruby正则表达式匹配

_____ table salt (1) [F] 

像往常一样,我试图与我自己和rubular.com战斗这场战斗。我得到的第一部分

^_____ (Match the beginning of the string with underscores). 

然后我得到了更大胆,

^_____(.*?) (Do the first part of the match, then give me any amount of words and letters after it) 

正则表达式已经受够了,杜绝了说胡话和crapped了。所以我想知道是否有人在stackoverflow知道或将有任何提示如何说我的目标到Ruby Regex解析器。

编辑:谢谢大家,这是我用rubular创建后最终使用的模式。

ingredientNameRegex = /^_+([^(]*)/; 

一切都变得更好,一旦我深吸了一口气,心里想着什么,我想说的。

回答

2

试试这个:^[_]+([^(]*)\(

它将匹配开始与一个或多个下划线后跟任何不等于一开口架线:http://rubular.com/r/vthpGpVr4y

+1

与_ – pguardiario

+0

是一样的事情,我只是为了清晰而添加了字符类 –

+0

请注意,您需要在您的$ 1结果中调用'strip'来删除前导和尾随空格。另外,恕我直言,将不必要的方括号加入到正则表达式本来的线性噪声中增加了复杂性,而不是清晰度。 – Phrogz

7
str = "_____ table salt (1) [F]" 
p str[ /_{3}\s(.+?)\s+\(/, 1 ] 
#=> "table salt" 

,上面写着:

  • 发现至少有三个下划线
  • 和空格字符,任何字符(.)的(\s
  • ,然后一个或多个(+),但尽可能少(?),直到找到
  • 一个或多个空白字符,
  • 然后字面(

中间的括号保存位和1拉出来。

1

这里的工作正则表达式:

str = "_____ table salt (1) [F]" 
match = str.match(/_([^_]+?)\(/) 
p match[1].strip # => "table salt" 
1

你可以使用

^_____\s*([^(]+?)\s*\(

^_____比赛从字符串的开头下划线

\s*匹配任何空白字符

(分组开始
[^(]+匹配所有非(字符至少一次
?最短的字符串匹配(非贪婪)
)分组结束

\s*匹配任何空白字符

\(找到(

+0

你可能想要一个'strip'作为结果。 – Phrogz

+0

@Phrogz添加了编辑 – cctan

+0

你不会逃跑(当它在[] – pguardiario

0
"_____ table salt (1) [F]".gsub(/[_]\s(.+)\s\(/, ' >>>\1<<< ') 
# => "____ >>>table salt<<< 1) [F]" 
0

在我看来,做你想要什么,最简单的正则表达式是:

/^_____ ([\w\s]+)/

,上面写着: 领先的下划线,空间,然后捕获字词或空格的任何组合,然后捕获另一个空间。