[英]With a JS Regex matching exact word but not hypenated words starting with said word
我找不到與此問題相匹配的內容。
我有這樣的字符串
var s="one two one-two one-three one one_four"
我的功能如下
function replaceMatches( str, word )
{
var pattern=new RegExp( '\\b('+word+')\\b','g' )
return str.replace( pattern, '' )
}
問題是如果我運行類似的功能
var problem=replaceMatches( s,'one' )
它
returns two -two -three one_four"
該函數將其替換為每個“一個”,但將帶有連字符的單詞視為兩個單詞,將連字符前的“一個”替換為兩個單詞。
我的問題不是關於功能,而是關於正則表達式。 什么文字正則表達式僅匹配字符串中的“一個”而不匹配“ 1-2”或“ one-w” <-您知道我的意思嗎?
基本上
var pat=/\b(one)\b/g
"one one-two one".replace( pat, '')
我要上面的^返回
" one-two "
僅替換完全匹配的“一個”,而不替換“一二”中的一個,最后一個“一”很重要,如果匹配最后,則正則表達式必須起作用謝謝,抱歉,如果我的問題相對令人困惑。 我只是想繼續學習,並擴大我的個人圖書館。
單詞是由1個或多個單詞字符組成的序列,並且單詞邊界\\b
是根據單詞字符(和非單詞字符)的定義來定義的。
JavaScript RegExp中\\w
定義的單詞字符是字符類[a-zA-Z0-9_]
。
您對“單詞”的定義是什么? 假設您的定義是[a-zA-Z0-9_-]
。
這篇文章描述了如何在支持后向和向前的語言中模擬單詞邊界。 太糟糕了,JS不支持后向。
為了簡單起見,讓我們假設要替換的詞是one
。
我們可以使用以下代碼限制替換:
inputString.replace(/([^a-zA-Z0-9_-]|^)one(?![a-zA-Z0-9_-])/g, "$1")
注意:我使用擴展形式[a-zA-Z0-9_-]
而不是[\\w-]
以避免與\\w
關聯。
分解正則表達式:
(
[^a-zA-Z0-9_-] # Negated character class of "word" character
| # OR
^ # Beginning of string
)
one # Keyword
(?! # Negative look-ahead
[a-zA-Z0-9_-] # Word character
)
我通過匹配否定字符類“ word”字符的字符和字符串開頭的^
模擬負(?<![a-zA-Z0-9_-])
如果支持,則為(?<![a-zA-Z0-9_-])
)。 這是很自然的,因為如果我們找不到“單詞”字符,那么它必須是非“單詞”字符或字符串的開頭。 一切都包裝在捕獲組中,以便以后可以替換。
由於one
如果沒有“字”字之前或之后,有沒有缺少匹配的風險只能更換。
由於要刪除“單詞”,因此必須確保關鍵字僅包含“單詞”字符。
function replaceMatches(str, keyword)
{
// The keyword must not contain non-"word" characters
if (!/^[a-zA-Z0-9_-]+$/.test(keyword)) {
throw "not a word";
}
// Customize [a-zA-Z0-9_-] and [^a-zA-Z0-9_-] with your definition of
// "word" character
var pattern = new RegExp('([^a-zA-Z0-9_-]|^)' + keyword + '(?![a-zA-Z0-9_-])', 'g')
return str.replace(pattern, '$1')
}
如果您對“單詞”字符的定義包括正則表達式元字符,則需要對關鍵字中的元字符進行轉義。
將此用於RegExp:
function replaceMatches( str, word ) {
var pattern = new RegExp('(^|[^-])\\b('+word+')\\b([^-]|$)', 'g');
return str.replace(pattern, '$1$3')
}
(^|[^-])
將匹配字符串的開頭或除-
之外的任何字符。 ([^-]|$)
將匹配-
以外的其他字符或字符串的結尾。
我不是JS模式函數專家,但是該函數應該替代所有函數。
作為在間“一兩個”連字符one
和-
是一個字boundry(即\\ b)和
如果在字符串的末尾有\\ w字符,則表示該單詞為邊界。
但是,聽起來您可能希望在“一個”之前加一個空格或BOL。
([ ]|^)one\\b
在這種情況下,您要制作替換捕獲組1,因此僅剝離“一個”。
而且,我不確定該函數調用在JS中如何工作。
編輯:在新的預期輸出之后,正則表達式可能是-
([ ]|^)one(?=[ ]|$)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.