Ruby正则表达式-如何匹配直到某个特定字符之前的所有内容-

22

给定一个字符串如下:

randomstring1-randomstring2-3df83eeff2

我该如何使用 Ruby 正则表达式或其他适用于 Ruby/Rails 的方法来查找第一个破折号 - 之前的所有内容?

在上面的示例中,结果应该是:randomstring1

谢谢

4个回答

47

您可以使用这个模式: ^[^\-]*


2
额...多了一个反斜杠。:) 当破折号是字符类中的第一个字符时(开头的脱字符不算作类中的字符,它是一个类修饰符,具体意思是“非”,即“不是该类中的任何字符”),它不需要转义。 - JBB
2
@JBB,我同意,这是我的习惯... :-) - Kirill Polishchuk
1
你能解释一下为什么这个有效吗?我没意识到你可以两次使用插入符号。 - Brad
@Brad,第一个插入符号是“字符串的开头”。[^\-]表示除了“-”以外的任何字符。 - Kirill Polishchuk
@KirillPolishchuk 谢谢,我理解了字符串的开头部分,但我不明白它在这里为什么被使用两次。这是否意味着 [^\-]* 表示任何不以 - 开头的字符串? - Brad
@Brad,不会的,它只会获取第一个匹配的字符串。尝试移除第一个 ^。在这种情况下,正则表达式将匹配 randomstring1randomstring23df83eeff2 - Kirill Polishchuk

9
mystring = "randomstring1-randomstring2-3df83eeff2"
firstPart = mystring[0, mystring.index("-")]

否则,我认为最好的正则表达式是@polishchuk的。
它从字符串开头开始匹配,在不是破折号-的任何内容中尽可能地匹配。

7

使用irb也可以这样做:

>> a= "randomstring1-randomstring2-3df83eeff2"
=> "randomstring1-randomstring2-3df83eeff2"
>> a.split('-').first
=> "randomstring1"
>> 

3

针对这种情况,agent-j提供的索引解决方案可能更好。如果您确实想使用正则表达式,以下非贪婪(由?指定)正则表达式将捕获它:

(^.*?)-

您可以在 Rubular 上查看它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接