使用正则表达式提取除特定短语之外的所有短语

时间:2013-09-15 00:23:32

标签: ruby regex ruby-on-rails-3.2

我有一个字符串,我想将除了某个模式之外的所有模式提取到另一个变量中。

first_string = "Q13 Hello, World!"

我希望将Hello, World!从字符串中移除到另一个变量中,以便:second_string = "Hello, World!"

我试图创建一个正则表达式来提取除“Q13”之外的所有内容,它可以在Rubular上运行但不在控制台中。

> first_string = "Q13 Hello, World!"
> second_string = first_string.scan(/[^(Q[0-9]{1,})]/)
=>  [" ", "H", "e", "l", "l", "o", ",", " ", "W", "o", "r", "l", "d", "!"] 
> second_string.join()
=> " Hello World!"

这很好,但我不能使用正则表达式失去领先的空间。除了我有一些特定于应用的警告之外,这不会是一个问题......

并非所有字符串都有“Q13”......“Q”将会出现但数字会改变。我不知道“Q13”是否会出现在文本的开头或结尾。我无法确定字符串中的文字是什么。

我不能依赖那里的领先空间。它也可能是一个尾随空间。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

试试这个:

second_string = first_string.scan(/\A(?:Q[0-9]+)?(?: )?(.*?)(?: )?(?:Q[0-9]+)?\z/).flatten.first

在Ruby控制台中进行实时测试

2.0.0p247 :001 > first_string = "Q12 Hello World! Q87"
 => "Q12 Hello World! Q87"
2.0.0p247 :002 > second_string = first_string.scan(/\A(?:Q[0-9]+)?(?: )?(.*?)(?: )?(?:Q[0-9]+)?\z/).flatten.first
 => "Hello World!"

答案 1 :(得分:0)

假设您要省略Q [数字]和任何周围的空格:

second_string = first_string.gsub(/\s?Q\d+\s?/, "")

如果要省略Q [编号]而不是周围的空格:

second_string = first_string.gsub(/Q\d+/, "")