我有一个字符串Test Data: Before the Data : "The War"
。我需要在第一个冒号后提取字符串。所以输出应该是:
在数据之前:"战争"
答案 0 :(得分:2)
您可以使用:
/:\s*\K.*/
\K
运算符在Ruby中没有详细记录,但您可以在perlre中找到它。
这种结构有一种特殊形式,称为\ K,它使正则表达式引擎能够保持"保持"它在\ K之前匹配的所有内容,而不包括在$& 。这有效地提供了可变长度的后视。 ...由于各种原因\ K可能比等效(?< = ...)构造更有效,并且在您希望有效地删除字符串中的其他内容的情况下,它尤其有用。
请考虑以下事项:
string = %q{Test Data: Before the Data : "The War"}.match(/:\s*\K.*/).to_s
#=> "Before the Data : \"The War\""
这将匹配第一个冒号后跟可选空格,将匹配丢弃到该点,然后将其余字符串捕获为MatchData。在MatchData对象上调用#to_s会将匹配作为String返回,以进行分配或输出。
答案 1 :(得分:2)
a = 'Test Data: Before the Data : "The War"'
p a[/: (.+)/, 1] #=> "Before the Data : \"The War\""
我不明白为什么这里的一些解决方案如此复杂,正则表达式应该非常简单:首先找到第一个冒号然后捕获它之后的所有内容。
答案 2 :(得分:2)
作为一个示例,String#partition方法将允许您将模式指定为字符串或正则表达式。因为你基本上只想使用冒号作为分隔符来丢弃字符串的前半部分,所以这将起作用:
string = %q{Test Data: Before the Data : "The War"}.partition(': ').pop
#=> "Before the Data : \"The War\""
字符串方法本身并不比Regexp或MatchData方法更好或更差,但在一般情况下它们通常更快。更重要的是,#partition是查看问题的另一种方式,并为您提供了一组操作结果的不同方法。
答案 3 :(得分:1)
使用字符串[]
运算符:
'Test Data: Before the Data : "The War"'[/[^:]*:(.*)/,1]
# => " Before the Data : \"The War\""
Doc是here。
正则表达式捕获第一个冒号后的所有内容。为了更加安全,我使用了一个否定类来匹配冒号之前的冒号[^:]
。
答案 4 :(得分:0)
只需删除第一个:
'Test Data: Before the Data : "The War" '.sub(/^[^:]*:/, "")
# => " Before the Data : \"The War\" "
如果您不想要前导空格,请尝试此操作。
'Test Data: Before the Data : "The War" '.sub(/^[^:]*:\s*/, "")
# => "Before the Data : \"The War\" "
答案 5 :(得分:0)
'Test Data: Before the Data : "The War"'
.split(": ", 2).last
#=> "Before the Data : \"The War\""
答案 6 :(得分:0)
试试这个:
a = 'Test Data: Before the Data : "The War"'.split(':',2)
print a[1..a.length]
#=> Before the Data : "The War"
String#split接受第二个参数,即限制。
答案 7 :(得分:-1)
开玩笑(解决方案根本不是基于正则表达式):
s='Test Data: Before the Data : "The War"'
s.split(':')[1..-1].join(':').strip
# => "Before the Data : \"The War\""