我有一个字符串:
"abc3-3213dsads123dsdsaasa7/basic-2.xhtml?"
我想获得:
"abc3-3213dsads123dsdsaasa7"
其中"abc3"
和"3213dsads123dsdsaasa7"
的长度是任意的。我在我的路由文件的约束中使用它。
我尝试过:
.+-.+[\/]
但是,它的末尾包含/
。可以匹配正则表达式中的字符,但在结果中忽略它吗?
答案 0 :(得分:5)
str = "abc3-3213dsads123dsdsaasa7/basic-2.xhtml?"
str[/.+(?=\/)/]
#=> "abc3-3213dsads123dsdsaasa7"
(?=\/)
是正向超前。它要求匹配的字符串后跟一个正斜杠。
或者,根据需要,您可以使用正则表达式/[^\/]+/
或/.+?-[^\/]+/
。
您也可以轻松地执行此操作,而无需使用正则表达式。
str[0, str.index('/')]
#=> "abc3-3213dsads123dsdsaasa7"
我假设对正斜杠之前的字符没有任何限制。这符合Unix系列(包括Linux和OS / X)中文件命名的限制,即文件名可以包含除正斜杠和NUL之外的任何字符。请参见here和here。 here讨论了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
仅会匹配单词字符,因此您可能希望将其替换为.
,或更笼统地说:^[^\/-]+-[^\/-]+
会将所有内容带到第一个斜杠。