簡體   English   中英

Ruby正則表達式/(\\/.*?(?=\\/|$)){2}/

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM