JavaScript Regex 的 字串比對(Match) 與 取代(Replace)

Javascript 的 Regex 該怎麼使用, 如何做 Match 和 Replace 的動作, 語法該怎麼寫.

先來一個簡單的 HTML source

<form name="form_name">
<input type="text" name="input_name" id="id_name" value="">
</form>

抓取 Input Value

// 直接抓取 form input value
var var_value = form_name.input_name.value;
// 若欄位有 id="id_name", 則用 var var_value = getElementById('id_name');

檢查輸入值是不是數字(Match)

// 可參考: JavaScript match() Method
// stringObject.match(searchvalue)
// match 語法: variable.match(regex), return null/regex value
var score = 12; // 1.2, 1., 1, -1.2, -1, -1., -1.25, -12., -13, -133.235, 133.235
var regex = /^-?\d+\.?\d*$/;
if (score.match(regex)==null) {
alert("不是數值");
}

字串取代(Replace)

// 參考: JavaScript replace() Method
// stringObject.replace(findstring,newstring)
// replace 語法: variable.replace(regex, '要取代成什麼字')
var str = "this is a book123!";
var regex=/book\d+/gi;  // 不能寫成 regex="/book\d+/gi";
alert(str.replace(regex,"test")); // 把 book123 取代成 test

其它


關於 Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
本篇發表於 Programming 並標籤為 。將永久鏈結加入書籤。

JavaScript Regex 的 字串比對(Match) 與 取代(Replace) 有 13 則回應

  1. sankai 說道:

    Tsung兄你好!誠心的請教您一些問題:
    var oldString = '44+4';
    newString = oldString.replace(/4/g,'#');
    預期結果是 44+#,但結果是 ##+#
    我去趴文之後,似乎要用「^匹配的是字符的開頭」和「$匹配的是字符的結尾」,於是修改如下:
    var oldString = '44+4';
    newString = oldString.replace(/^4$/g,'#');
    但結果是 44+4 沒有改變。JS的正規表達式似乎跟PHP有些出入
    所以此段結論為「如何取代字串中指定的數字?」
    另外一個想法是,是否有辨法動態產生「正規式」,預期的程式會如下:
    var num_arr = Array(1,3,5);
    var oldString = '1+2+3+4+5+6';
    for(var i=0; i

  2. Tsung 說道:

    不好意思, 您下面的程式我沒有看到完整的, 所以不知道該怎麼跟您說~
    然後上面的表達式, 您寫法只要 newString = oldString.replace(/4$/g,'#'); 這樣子就可以囉~ 🙂

  3. sankai 說道:

    剛經過測試replace(/4$/g,'#')方式
    在一個字串含有多個重複的字元時,似乎只會取代最後一個出現的字元
    str = '4+44+44+4';0
    str.replace(/4$/g,'#');
    //預期為'#+44+44+#'
    //結果為'4+44+44+#'
    至於動態產生規式,在上述方式都未能達成的情況上,就先暫不考慮了=_=
    最後還是仍然感謝Tsung兄的回覆,看來我得跟這個問題撕殺一陣子了

  4. Tsung 說道:

    我寫的那個只是要取代最後一個, 因為你上面的範例是跟我說只要取代最後一個說~ @.@a..
    至於要取代前面, 我通常會在下面再多作一次取代前面的動作, 用 "^4" 即可~ 🙂
    就是兩次 replace 就搞定囉 🙂

  5. 貝爾丹迪 說道:

    textdoc = "4+44+444+4+44+4";
    textdoc = "+" + textdoc + "+"
    textdoc = textdoc.replace(/\+4\+/g,'+#+');
    answer = textdoc.replace(/^\+|\+$/g,'');
    要代換兩次才弄的出來
    首先 文字的前後都加上一個+
    然後中間有+4+換成+#+
    最後在把頭尾的+號弄掉
    就大功告成
    基本上 要剛好1個4 大概只能這樣做了

  6. Ding 說道:

    var str = "4+44+4+444+4";
    str.replace(/([^4]{1}|^)4{1}([^4]{1}|$)/g,"$1#$2")

  7. 彼得小兔 說道:

    可以使用 new Regex(pattern) 達成動態產生正規表達式
    var pattern = "(^\\d*)$";
    var regex = new Regex(pattern);
    regex.test("222");

  8. 湯包 說道:

    Tsung兄你好,
    文中所述的 match,var regex = /^-?\d+\.?\d*?$/;
    最後(最右邊)的問號,不要加上會比較好
    var regex = /^-?\d+\.?\d*$/;
    加上那個問號,會造成數值小數點以下被切斷
    其實星號本來就有0或無限重覆的特性

    • Tsung 說道:

      嗯嗯, 我最後一個 ? 不是為了 [0,n] 的, 是為了要記得停止用, 很習慣就加上去了. XD

      但是用 \d 的話, 確實 "?" 是多餘的, 非常感謝指點~ 已經修正 😀

  9. sya 說道:

    請問如果我想要透過 replace 用正則去匹配 字串 最後一個 # 以及 #之後的所有字串
    應該要怎麼寫?

    也就是我想要

    .html?abc=111#&455#=w#gogo
    丟下去匹配完
    可以匹配到 #gogo

    .html?abc=111#&455#=w#99999999999
    丟下去匹配完
    可以匹配到 #99999999999

    我試著自己拼湊規則
    但不管是寫

    /#.*$/m
    /#.{0,}$/
    /\u0023.*$/

    都會匹配第一個#以及第一個#之後到字串最後

    不知道怎麼寫才會只匹配到最後一個#+最後一個之後的字串?

  10. Kenneth Chan 說道:

    Tsung 你好,
    我在google search 到你的文章, 想請教一下.
    在javascript, regex 能否對replacement value做點計算?

    比如原文是"I have book1" 通過 str.replace('/book\d+/', 'book'+(d+1))改成
    "I have book2".
    謝謝.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料