[英]Ruby regexp /(\/.*?(?=\/|$)){2}/
我的正則表達式的行為就像我希望它在http://regexr.com ,但不像我想在IRB。
我正在嘗試制作一個符合以下條件的正則表達式:
A forward slash,
then 2 * any number of random characters (i.e. `.*`),
up to but not including another /
OR the end of the string (whichever comes first)
我很抱歉,因為可能還不清楚,但這是我最好的英語翻譯嘗試。
這是我當前的嘗試,希望可以使您對我正在嘗試做的事情有更好的了解:
/(\/.*?(?=\/|$)){2}/
使用場景是我希望能夠采用/foo/bar/baz/bin/bash
類的路徑並將其縮短到我在文件系統中所處的級別,在這種情況下為第二級( /foo/bar
) 。 我正在嘗試使用命令path.scan(-regex-).shift
來執行此操作。
使用場景是我希望能夠采用/ foo / bar / baz / bin / bash之類的路徑並將其縮短到我在文件系統中所處的級別,在這種情況下為第二級(/ foo / bar)
Ruby已經有一個用於處理路徑的類Pathname 。 您可以使用Pathname#relative_path_from來執行所需的操作。
require 'pathname'
path = Pathname.new("/foo/bar/baz/bin/bash")
# Normally you'd use Pathname.getwd
cwd = Pathname.new("/foo/bar")
# baz/bin/bash
puts path.relative_path_from(cwd)
正則表達式只會引發問題,例如假設路徑分隔符為/
,不接受轉義符,並且不處理多余的/
。 例如, "//foo/bar//b\\\\/az/bin/bash"
。 //
在使用paths.join("/")
或"#{dir}/#{file}
paths.join("/")
將目錄連接在一起的代碼中特別常見。
為了完整起見,匹配單個路徑的一般方法是這樣。
%r{^(/[^/]+)}
那是字符串的開始,一個/
,然后是1個或多個不是/
字符。 使用[^/]+
意味着您不必嘗試匹配可選的/
或字符串結尾,這是一種非常有用的技術。 使用%r{}
意味着更少的牙簽 。
但這僅適用於規范化路徑。 它將在//foo//b\\\\/ar/
上失敗。 您可以嘗試修復正則表達式以解決該問題,也可以自己進行規范化,但只需使用路徑名即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.