正则表达式可以匹配特定字符,但不返回结果吗?

时间:2018-12-14 01:47:40

标签: ruby regex

我有一个字符串:

"abc3-3213dsads123dsdsaasa7/basic-2.xhtml?"

我想获得:

"abc3-3213dsads123dsdsaasa7"

其中"abc3""3213dsads123dsdsaasa7"的长度是任意的。我在我的路由文件的约束中使用它。

我尝试过:

.+-.+[\/]

但是,它的末尾包含/。可以匹配正则表达式中的字符,但在结果中忽略它吗?

3 个答案:

答案 0 :(得分:5)

str = "abc3-3213dsads123dsdsaasa7/basic-2.xhtml?"

str[/.+(?=\/)/]
  #=> "abc3-3213dsads123dsdsaasa7"

(?=\/)正向超前。它要求匹配的字符串后跟一个正斜杠。

或者,根据需要,您可以使用正则表达式/[^\/]+//.+?-[^\/]+/

您也可以轻松地执行此操作,而无需使用正则表达式。

str[0, str.index('/')]
 #=> "abc3-3213dsads123dsdsaasa7"

我假设对正斜杠之前的字符没有任何限制。这符合Unix系列(包括Linux和OS / X)中文件命名的限制,即文件名可以包含除正斜杠和NUL之外的任何字符。请参见hereherehere讨论了Windows对文件名的限制。

答案 1 :(得分:3)

我不使用正则表达式就可以使用它:

str = "abc3-3213dsads123dsdsaasa7/basic-2.xhtml?"

str.partition("/").first
# => "abc3-3213dsads123dsdsaasa7"

答案 2 :(得分:1)

您可以使用:

^(\w+)-(\w+)

演示https://regex101.com/r/xGCTbY/2

如果您不需要捕获字符串的子部分,则可以删除( )

假设:字符串的开头没有其他字符,否则约束^在这里不起作用,您应该使用正数(?=\/)进行前瞻。< / p>

此外,\w仅会匹配单词字符,因此您可能希望将其替换为.,或更笼统地说:^[^\/-]+-[^\/-]+会将所有内容带到第一个斜杠。