我有一個字串 url "home/products/product_name_1/details/some_options"
,我想用 Regexp 將它決議成陣列["home", "products","product","details","some"]
所以規則是“如果反斜杠按單詞分割,但如果單詞有下劃線 - 只取第一個下劃線之前的部分”
此正則運算式的 JavaScript 等效項是
str.split("/").map(item => item.indexOf("_") > -1 ? item.split("_")[0] : item)
請幫忙!
uj5u.com熱心網友回復:
你可以使用這個模式
(?<!\w)[^/_]
結果
['home', 'products', 'product', 'details', 'some']
蟒蛇代碼
import re
str="home/products/product_name_1/details/some_options"
re.findall('(?<!\w)[^/_] ',str)
['home', 'products', 'product', 'details', 'some']
uj5u.com熱心網友回復:
試試這個:
input = ["home/products/product_name_1/details/some_options",
"company/products/cars_all/details/black_color",
"public/places/1_cities/disctricts/1234_something"]
let pattern = /([a-zA-Z\d]*)(?:\/|_.*?(?:\/|$))/gmi
input.forEach(el => {
let matches = el.matchAll(pattern)
for (const match of matches) {
console.log(match[1]);
}
})
\d如果您不希望 url 中有數字,請從正則運算式模式中洗掉。我在這里使用了matchAll,matchAll回傳一個迭代器,用它來獲取每個匹配物件,其中第一個元素是完整匹配,第二個元素(索引:)1是所需的組。
/([a-zA-Z\d]*)(?:\/|_.*?(?:\/|$))/gmi
/
([a-zA-Z\d]*) capture group to match letters and digits
(?:\/|_.*?(?:\/|$)) non capture group to match '/' or '_' and everything till another '/' or end of the line is found
/gmi
你可以在這里測驗這個正則運算式:https ://regex101.com/r/B5Bo74/1
uj5u.com熱心網友回復:
您可以使用:
\b[^\W_]
\b防止部分匹配的單詞邊界[^\W_]匹配 1 個單詞字符,除了_
查看正則運算式演示。
const s = "home/products/product_name_1/details/some_options";
const regex = /\b[^\W_] /g;
console.log(s.match(regex));
如果/在匹配之前必須有一個前導或字串的開頭,您可以使用交替(?:^|\/)并使用捕獲組來獲取要保留的值:
const s = "home/products/product_name_1/details/some_options";
const regex = /(?:^|\/)([^\W_] )/g;
console.log(Array.from(s.matchAll(regex), m => m[1]));
uj5u.com熱心網友回復:
給定輸入:
- 細繩
"home/products/product_name_1/details/some_options"
預期輸出:
- 大批
["home", "products", "product", "details", "some"] - 注意:忽略/排除
name,1,options(因為單詞出現在第一個下劃線之后)。
任務:
- 通過斜杠將URI拆分為一組路徑段(單詞)
- (如果路徑段或單詞包含下劃線)洗掉第一個下劃線之后的部分
正則運算式匹配
使用正則運算式\/|_\w ,您可以匹配URL 路徑分隔符(斜杠)和排除的單詞部分(下劃線后的每個單詞)。
然后使用這個正則運算式
- 或者作為分隔符將字串拆分成各個部分(不包括正則運算式匹配):例如在 JS 中
split(/\/|_\w /) - 或者作為替換中的搜索模式來準備一個可以輕松拆分的字串:例如,在 JS
replaceAll(/\/|_\w /g, ',')中獲取可以通過逗號輕松拆分的 CSV 行 `split(',')
注意:正則運算式本身(風格)和應用它的函式取決于您的環境/正則運算式引擎和腳本/編程語言。
正則運算式應用于 Javascript
按正則運算式拆分
例如在 Javascript 中使用url.split(/\/|_\w*/)where:
/pattern/:斜杠內的所有內容都是正則運算式模式\/: ac 斜杠(URL 路徑分隔符)|:備用連接點,解釋為布林值或_\w*: 下劃線后的零個或多個 (*) 單詞字符(w,即字母表中的字母、數字或下劃線)
也可以看看:
- 在 String.split() 中使用捕獲組
但是,這也會回傳空字串(作為包含下劃線的路徑段內的空拆分第二部分)。如果字串非空,我們可以使用filterwhere 謂詞回傳 true來洗掉空字串。s => s
演示解決您的任務:
const url = "home/products/product_name_1/details/some_options";
let firstWordsInSegments = url.split(/\/|_\w*/).filter(s => s);
console.log(firstWordsInSegments);
const urlDuplicate = "home/products/product_name_1/details/some_options/_/home";
console.log(urlDuplicate.split(/\/|_\w*/).filter(s => s)); // contains duplicates in output array
替換為 CSV,然后拆分和排除(映射、替換、過濾)
包含路徑段的 CSV 可以用逗號分隔,并且可以過濾或替換結果部分(路徑段)以排除不需要的子部分。
使用:
replaceAll轉換為 CSV 或洗掉空字串。注意:使用正則運算式呼叫 replaceAll 時需要全域標志map洗掉下劃線后不需要的部分filter(s => s)過濾掉空字串
const url = "home/products/product_name_1/details/some_options";
// step by step
let pathSegments = url.split('/');
console.log('pathSegments:', pathSegments);
let firstWordsInSegments = pathSegments.map(s => s.replaceAll(/_\w*/g,''));
console.log(firstWordsInSegments);
// replace to obtain CSV and then split
let csv = "home/products/product_name_1/details/some_options/_/home".replaceAll(/\/|_\w /g, ',');
console.log('csv:', csv);
let parts = csv.split(',');
console.log('parts:', parts); // contains empty parts
let nonEmptyParts = parts.filter(s => s);
console.log('nonEmptyParts:', nonEmptyParts); // filtered out empty parts
獎金提示
在線嘗試您的正則運算式(例如 regex101 或 regexplanet)。請參閱regex101 上的演示。
uj5u.com熱心網友回復:
您可以使用此正則運算式拆分網址
(_\w*) |(\/)
這與 /、_name_1 和 _options 匹配。
但是,根據您想要做什么,或者您使用哪種語言,有更好的選擇來做到這一點。
uj5u.com熱心網友回復:
您可以嘗試類似的模式\/([^\/_] ){1,}(假設路徑以'/'開頭并且組件由'/'分隔);根據語言,您可能會得到一個陣列或迭代器來提供組件。
uj5u.com熱心網友回復:
嘗試^[[:alpha:]] |(?<=\/)[[:alpha:]] 或^[a-zA-Z] |(?<=\/)[a-zA-Z] 如果不支持 [[:alpha:]] ,它匹配開頭或斜線之后的一個或多個字符,直到第一個非字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/425905.html
標籤:javascript 网址 分裂
上一篇:我在表單中的操作url做錯了什么
