簡體   English   中英

如何在兩個標記之間捕獲文本?

[英]How to capture text between two markers?

為了清楚起見,我創建了以下代碼:

http://rubular.com/r/ejYgKSufD4

我的琴弦:

http://blablalba.com/foo/bar_soap/foo/dir2
http://blablalba.com/foo/bar_soap/dir
http://blablalba.com/foo/bar_soap

我的正則表達式:

\/foo\/(.*)

返回:

/foo/bar_soap/dir/dir2
/foo/bar_soap/dir
/foo/bar_soap

但是我只想要

/foo/bar_soap

有什么想法可以實現這一目標嗎? 如上所示,我希望foo之后直到第一個正斜杠為止的所有內容。

提前致謝。

編輯。 我只想要foo之后的文本,直到之后的下一個正斜杠為止。 一些目錄也可能被命名為foo ,這將導致錯誤的結果。 謝謝

. 將匹配任何內容,因此您應將其更改為[^/] (而不是斜杠):

\/foo\/([^\/]*)

其他一些答案使用+而不是* 根據您要做什么,這可能是正確的。 使用+強制正則表達式匹配至少一個非斜杠字符,因此此URL將不匹配,因為斜杠后沒有尾隨字符:

http://blablalba.com/foo/

使用*代替將允許匹配,因為它匹配“零個或多個”非斜杠字符。 因此,是否應使用+*取決於要允許的匹配項。

更新

如果您也想過濾掉查詢字符串 ,也可以針對?過濾? ,它必須位於所有查詢字符串的最前面。 (我認為您在下面發布的示例實際上缺少開頭? ):

\/foo\/([^?\/]*)

但是,與其使用自己的解決方案,不如使用URI模塊中的split可能更好。 您可以使用URI::split來獲取URL的路徑部分,然后使用String#split通過/將其String#split ,並獲取第一個。 這將處理所有奇怪的URL情況。 您可能還沒有的是帶有指定片段的URL,例如:

http://blablalba.com/foo#bar

您還需要在過濾的字符類中添加#來處理這些字符。

\\/foo\\/([^\\/]+)

[^\\/]+為您提供了一系列非正斜杠的字符。

括號導致正則表達式引擎的匹配內容存儲在一組([^\\/]+)所以可以得到bar_soap出的整個比賽的/foo/bar_soap

例如,在javascript中,您將獲得匹配的組,如下所示:

regexp = /\/foo\/([^\/]+)/ ;
match = regexp.exec("/foo/bar_soap/dir");
console.log(match[1]);  // prints bar_soap

您可以嘗試使用此正則表達式

/\/foo\/([^\/]+)/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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