簡體   English   中英

使用JS正則表達式匹配確切的單詞,但不匹配以該單詞開頭的連詞

[英]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.

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