2013-02-21 48 views
0

用戶將提供字符串,我想通過預定義字符串列表搜索該字符串。訣竅是,用戶的字符串可以是任何東西,包括正則表達式的字符,如[*?^等,所以像與任意(用戶提供的)字符串匹配的正則表達式

"first half of my regex" + `USER_STRING` + "second half of my regex" 

將無法​​正常工作。一個顯而易見的解決方案是用逃脫的對手逃脫USER_STRING中的所有特殊字符,但有一個更好的方法。

PS:另外,一個簡單的字符串搜索將不會執行,因爲我需要匹配字符串的左側和右側的模式。

+0

除了使用戶字符串正則表達式安全外,還有更好的方法嗎? – 2013-02-21 14:05:48

+0

你可以做兩件事嗎?首先匹配你的正則表達式,然後通過匹配進行字符串搜索。 – freejosh 2013-02-21 14:07:48

+1

@TimPietzcker:不過,我不知道爲什麼這些答案會轉義爲「-'。當'[]'被轉義時,沒有必要這樣做。 – nhahtdh 2013-02-21 14:54:55

回答

0

JavaScript沒有內置的正則表達式轉義函數(例如類似於PHP的preg_quote)。儘管如此,有些人已經自行創建了一個等價物:https://stackoverflow.com/a/6829401/454533

所以不,沒有更好的方法。

0

只需使用此功能,以確保所有的特殊字符進行報價和爲文字字符的正則表達式處理:

function escapeRegex(input) { 
    return input.replace(/[[\](){}?*+^$\\.|]/g, '\\$&'); 
} 

功能指望一個字符串作爲輸入和輸出的所有特殊字符的字符串逃過一劫。這是爲了創建一個字符串,可以將其提供給RegExp構造函數來創建與原始字符串匹配的正則表達式。關於這種方法的輸出是否可以安全地連接,請查看下面的附加說明。

MDN上的all special characters in JS regex的列表。

  • 沒什麼要說這些^$.|*?+
    這也有效地禁用^裏面的[]的特殊含義,如果第一個字符()裏面的第一個字符和?
    ?和遵循量詞的延遲匹配行爲相同。

  • -只在[]內有意義 - 但在[]轉義時不再有意義。
    如果模板字符串爲"[" + input + "]",則可能存在問題。我不在此處模擬字符類中的\Q\E的行爲,但如果需要,可以將-添加到上述函數中的正則表達式中。

  • \後面跟着一些特殊的序列將失去其意義\逃脫。
    在相關說明中,上述方法失敗的情況是模板字符串爲"\\" + input時。但是,我會說錯誤在於誰寫了模板字符串,因爲這是完全無意義的。

  • :=!只是內部()有意義(非捕獲組和前瞻)和?後必須遵循的,但也失去了它的意義時()被轉義。 ?已被轉義,因此當轉義字符串插入()之間時,它不會造成問題。
    如果模板字符串爲"(?" + input + ")",則上述方法無法轉義。我再次責怪誰寫這個,因爲他們是允許注射的人。

  • ,只是裏面{}有意義的,但失去了它的意義時{}被轉義。
    轉義失敗的情況是,當你有模板字符串(例如,以匹配初始化)"\\w+ = {" + input + "}",但通常情況下,人會逃脫{}模板字符串,如果目的是要配合他們的文字字符。
    也有重複的情況,但是,模板字符串應該是".{" + start + "," + end + "},並且輸入必須首先進行消毒。

總之,模板字符串中的元字符必須正確轉義才能使任何轉義函數正常工作。如果要在字符類中使用轉義字符串,請將-添加到字符類中。