[英]Javascript — Regex — Blacklist of multiple words to END with a partial match
[英]Regex to match partial words (JavaScript)
我想制作一個與街道名稱匹配的不區分大小寫的正則表達式(對於JavaScript),即使每個單詞都已縮寫。 例如:
n univ av應該匹配N Univ ersity Av e
國王blv應該匹配Martin Luther King Jr. Blv d
ne 9th應該匹配NE 9th St和9th St NE
使用<b>
標簽包裝匹配文本的“替換”正則表達式的加分點(JK)。
你得到了:
"n univ av"
你要:
"\bn.*\buniv.*\bav.*"
所以你也是:
var regex = new RegExp("n univ av".replace(/(\S+)/g, function(s) { return "\\b" + s + ".*" }).replace(/\s+/g, ''), "gi");
瞧!
但我沒有完成,我想要我的獎勵積分。 所以我們將模式更改為:
var regex = new RegExp("n univ av".replace(/(\S+)/g, function(s) { return "\\b(" + s + ")(.*)" }).replace(/\s+/g, ''), "gi");
接着:
var matches = regex.exec("N University Ave");
現在我們得到了:
所以,我們可以寫:
var result = '';
for (var i=1; i < matches.length; i++)
{
if (i % 2 == 1)
result += '<b>' + matches[i] + '</b>';
else
result += matches[i];
}
function highlightPartial(subject, search) {
var special = /([?!.\\|{}\[\]])/g;
var spaces = /^\s+|\s+/g;
var parts = search.split(" ").map(function(s) {
return "\b" + s.replace(spaces, "").replace(special, "\\$1");
});
var re = new RegExp("(" + parts.join("|") + ")", "gi");
subject = subject.replace(re, function(match, text) {
return "<b>" + text + "</b>";
});
return subject;
}
var result = highlightPartial("N University Ave", "n univ av");
// ==> "<b>N</b> <b>Univ</b>ersity <b>Av</b>e"
附注 - 此實現不關注匹配順序,因此:
var result = highlightPartial("N University Ave", "av univ n");
// ==> "<b>N</b> <b>Univ</b>ersity <b>Av</b>e"
如果這是一個問題,那么需要一個更精細的順序方法,這是我通過使用replace()
回調函數避免的。
簡單:
var pattern = "n univ av".replace(/\s+/, "|");
var rx = new RegExp(pattern, "gi");
var matches = rx.Matches("N University Ave");
或者沿着這些方向的東西。
如果這些是您的搜索字詞:
聽起來你的算法應該是這樣的
input.split(/\\s+/)
/term/i
<b>
標記中的術語。 input.replace(/(term)/gi, "<b>\\$1</b>")
注意:您可能希望采取預防措施來逃避正則表達式元字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.