[英]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將不匹配,因為斜杠后沒有尾隨字符:
使用*
代替將允許匹配,因為它匹配“零個或多個”非斜杠字符。 因此,是否應使用+
或*
取決於要允許的匹配項。
更新
如果您也想過濾掉查詢字符串 ,也可以針對?
過濾?
,它必須位於所有查詢字符串的最前面。 (我認為您在下面發布的示例實際上缺少開頭?
):
\/foo\/([^?\/]*)
但是,與其使用自己的解決方案,不如使用URI模塊中的split
可能更好。 您可以使用URI::split
來獲取URL的路徑部分,然后使用String#split
通過/
將其String#split
,並獲取第一個。 這將處理所有奇怪的URL情況。 您可能還沒有的是帶有指定片段的URL,例如:
您還需要在過濾的字符類中添加#
來處理這些字符。
\\/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.