MozTW 討論區

各項 Mozilla 相關軟體與技術討論
現在的時間是 2025-06-23, 23:50

所有顯示的時間為 UTC + 8 小時





發表新文章 回覆主題  [ 8 篇文章 ] 
發表人 內容
文章發表於 : 2007-04-29, 17:16 
離線
頭像

註冊時間: 2006-10-28, 15:41
文章: 1421
來自: マカオ
一個很看起來很笨的問題... :oops:

現在我有一字串:
代碼:
string = "first:10second:20last:30"

請問, 應該要用甚麼方法才能把中間的 20 改成 40 :?:
代碼:
string = "first:10second:40last:30"

* 當中的數字為自變量, 其餘均為固定字串 *

_________________
圖檔 挑選‧儲存圖片 圖檔 History Submenus Ⅱ 圖檔 Personal Menu
圖檔 Page Title in URL Bar 圖檔 Double Click Top-Left to Close


最後由 Merci chao 於 2007-04-29, 20:50 編輯,總共編輯了 2 次。

回頂端
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2007-04-29, 18:33 
離線

註冊時間: 2005-10-12, 19:48
文章: 227
來自: 香港
replace substring ???? :?: :?: :?:

example:
代碼:
/***************************************************************************************************/
var str = "AA BB CC DD EE, AA BB CC DD EE";
str = str.replace("AA", "11");         //use substring as parameter, replace only the first match
alert('parameter use substring:\n' + str);
/*
output:

parameter use substring:
11 BB CC DD EE, AA BB CC DD EE
*/
/***************************************************************************************************/

str = "AA BB CC DD EE, AA BB CC DD EE";
str = str.replace(/DD/g, "22");      //use regular expression, set replace flag to global, then replace all match
alert('parameter use regex:\n' + str);
/*
output:

parameter use regex:
AA BB CC 22 EE, AA BB CC 22 EE
*/
/***************************************************************************************************/

str = "AA BB CC DD EE, AA BB CC DD EE";
//g = global search
str = str.replace(/DD/g, "22");      //replace all match
alert('regex with flag global:\n' + str);
/*
output:

regex with flag gloabl:
AA BB CC 22 EE, AA BB CC 22 EE
*/
/***************************************************************************************************/

str = "AA BB CC DD EE, AA BB CC DD EE";
//without global flag
str = str.replace(/DD/, "22");      //replace the first match only
alert('regex without flag global:\n' + str);
/*
output:

regex without flag global:
AA BB CC 22 EE, AA BB CC DD EE
*/
/***************************************************************************************************/

// i = ignore case
str = "AA BB CC DD EE, aa BB CC DD EE";
str = str.replace(/aa/gi, "Apple");
alert('regex with flag ignore case:\n' + str);
/*
output:

regex with flag ignore case:
Apple BB CC DD EE, Apple BB CC DD EE
*/
/***************************************************************************************************/
// ignore case is not set
str = "AA BB CC DD EE, aa BB CC DD EE";
str = str.replace(/aa/g, "Apple");
alert('regex without flag ignore case:\n' + str);
/*
output:

regex without flag ignore case:
AA BB CC DD EE, Apple BB CC DD EE
*/
/***************************************************************************************************/
//m = multi-line
str = "AA BB CC DD EE" +  "\n"  + "AA BB CC DD EE";
str = str.replace(/^AA/gm, "Apple");      //replace string which is beginning of 'AA'
alert('regex with flag multi-line:\n' + str);
/*
output:

regex with flag multi-line:
Apple BB CC DD EE
Apple BB CC DD EE
*/
/***************************************************************************************************/
//if multi-line is not set
str = "AA BB CC DD EE" +  "\n"  + "AA BB CC DD EE";
str = str.replace(/^AA/g, "Apple");
alert('regex without flag multi-line:\n' + str);

/*
output:

regex without flag multi-line:
Apple BB CC DD EE
AA BB CC DD EE
*/
/***************************************************************************************************/


refs:
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:String:replace

http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:RegExp

_________________
新同文堂 相關討論新同文堂 官方網頁

準備退休,隱身一段時間、遲些再見。


回頂端
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2007-04-29, 20:48 
離線
頭像

註冊時間: 2006-10-28, 15:41
文章: 1421
來自: マカオ
有點眼花....@@"
大概明白原理吧, 不過看來是我表達得不清楚...

我的想法是這樣的:
代碼:
var string = "first:10second:20last:30";

// 未知方法...
...............
...............
...............
// 把字串分割, 得到如下兩部份:
// string1 = "first:10second:";
// string2 = "last:30";

string = string1 + 40 + string2; // 與新數值合併
其實我忘記了說當中的數字是自變量來的 :oops:

_________________
圖檔 挑選‧儲存圖片 圖檔 History Submenus Ⅱ 圖檔 Personal Menu
圖檔 Page Title in URL Bar 圖檔 Double Click Top-Left to Close


回頂端
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2007-04-29, 21:31 
離線
頭像

註冊時間: 2005-08-25, 19:59
文章: 1210
來自: 幻境地帶
var s = "first:10second:20last:30";
var m = s.match(/^first:(\d+)second:(\d+)last:(\d+)$/);
m[1] //10
m[2] //20
m[3] //30

_________________
Add Bookmark Here ² | Charset Switcher | Hide Menubar | MClickFocusTab | Personal Titlebar


回頂端
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2007-04-30, 02:01 
離線

註冊時間: 2005-10-12, 19:48
文章: 227
來自: 香港
yuoo2k 寫:
var s = "first:10second:20last:30";
var m = s.match(/^first:(\d+)second:(\d+)last:(\d+)$/);
m[1] //10
m[2] //20
m[3] //30


我本來想起的是 string.split,不過看來yuoo2k
建議的 string.match 是更好的選擇,因為他可以方便處理 no match 的情況。

code大約如下
代碼:
var s = "first:10second:20last:30";
var re = /^first:(\d+)second:(\d+)last:(\d+)$/;

var m = s.match(re);

if (m != null){     
   m[2] = 40;
   var str = "first:" + m[1] + "second:" + m[2] + "last:" + m[3];             
   alert(str);      //first:10second:40last:30
}


另外,留意一下
string.match 的 regex parameter使用 g ,傳回的會是array of all matches

string.match 的 regex parameter 沒有使用 g ,傳回的會是array of all submatches。
代碼:
//regular expression 使用 g (global)後,string.match就不會傳回 submatch

var s = "first:10second:20last:30,first:40second:50last:60";

var re = /first:(\d+)second:(\d+)last:(\d+)/g;
var m = s.match(re);

if (m != null){
   alert('m[0]:' + m[0]);  //m[0]:first:10second:20last:30
   alert('m[1]:' + m[1]);  //m[1]:first:40second:50last:60
}


代碼:
// 使用 regex.exec(string)例子,目的是取得regex submatch string

var s = "first:10second:20last:30,first:40second:50last:60";

var re = /first:(\d+)second:(\d+)last:(\d+)/g;
var m = re.exec(s);

if (m != null){
   alert(m[0]);  //first:10second:20last:30
   alert(m[1]);  //10
   alert(m[2]);  //20
   alert(m[3]);  //30
}

m = re.exec(s);   //注意這裡會從 Last match position開始找,而不是重頭開始找

if (m != null){
   alert(m[0]);  //first:40second:50last:60
   alert(m[1]);  //40
   alert(m[2]);  //50
   alert(m[3]);  //60
}





順便還想說一下,雖然有一點離題,string.replace的第二個 parameter不一定是 constant string,也可以是 function (javascript 1.3上支援),如果只想將 substring作某些處理,再放回原來 string中, 這時使用 function variable就更方便。

e.g.
string.replace(regexp/substr, newSubStr/function[, flags])

代碼:
//example:
var s = "first:10second:20last:30,first:40second:50last:60";
var re = /(\d+)/g;

var f = function(x){
   x = parseInt(x);
   x = x + 10;
   return x;
};

s = s.replace(re, f);
alert(s);   //first:20second:30last:40,first:50second:60last:70


refs:
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:String:replace

http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:String:match

_________________
新同文堂 相關討論新同文堂 官方網頁

準備退休,隱身一段時間、遲些再見。


回頂端
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2007-04-30, 17:27 
離線
頭像

註冊時間: 2006-10-28, 15:41
文章: 1421
來自: マカオ
謝謝兩位的解答 :D
看來有空應該要學一學基礎的東西了 =="

想問一問, 以下紅色部份的意思分別是甚麼 :?:
引言回覆:
/^first:(\d+)second:(\d+)last:(\d+)$/

_________________
圖檔 挑選‧儲存圖片 圖檔 History Submenus Ⅱ 圖檔 Personal Menu
圖檔 Page Title in URL Bar 圖檔 Double Click Top-Left to Close


回頂端
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2007-04-30, 18:13 
離線
頭像

註冊時間: 2006-10-27, 07:29
文章: 1068
Merci chao 寫:
謝謝兩位的解答 :D
看來有空應該要學一學基礎的東西了 =="

想問一問, 以下紅色部份的意思分別是甚麼 :?:
引言回覆:
/^first:(\d+)second:(\d+)last:(\d+)$/


JavaScript的正則表達式會放在兩個/中間
所以會有/blahblah/就代表這是一個正則表達式
而^代表的是行首匹配,$代表行尾匹配
\d對任一個數字做匹配(與[0-9]同義)
+代表前面的匹配至少出現一次以上(與{1,}同義)

詳細可以參照wikipedia的說明


回頂端
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.3) Gecko/20061201 Firefox/2.0.0.3 (Ubuntu-feisty)
 個人資料  
引用回覆  
 文章主題 :
文章發表於 : 2007-05-02, 14:09 
離線
[網站管理員]
頭像

註冊時間: 2004-09-27, 09:24
文章: 1685
Merci chao 寫:
謝謝兩位的解答 :D
看來有空應該要學一學基礎的東西了 =="

想問一問, 以下紅色部份的意思分別是甚麼 :?:
引言回覆:
/^first:(\d+)second:(\d+)last:(\d+)$/

/ 是開始 RegExp,^ 匹配行首,\d 代表任意一個數字(同 [0-9]),括號是「記憶群組」(會出現在傳回的陣列),+ 代表至少要出現一次或者以上(同 {1,}),$ 匹配行尾,/ 是結束 RegExp。

順帶一提:
+ 跟 {1,} 一樣,一次或者以上
* 是 {0,},就是所謂「可有可無也可重複」

(x) 會把整個表達式群組起來記憶匹配並會在陣列傳回
(?:x) 有群組效果,但沒有記憶效果
群組很有用,比如說 (ab)+ 會批配 ababab

_________________
korp + korp 中文站(沒精神更新)


回頂端
Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3
 個人資料  
引用回覆  
顯示文章 :  排序  
發表新文章 回覆主題  [ 8 篇文章 ] 

所有顯示的時間為 UTC + 8 小時


誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 28 位訪客


不能 在這個版面發表主題
不能 在這個版面回覆主題
不能 在這個版面編輯您的文章
不能 在這個版面刪除您的文章
不能 在這個版面上傳附加檔案

搜尋:
前往 :  
Powered by phpBB® Forum Software © phpBB Group
正體中文語系由 竹貓星球 維護製作
© moztw.org, Mozilla Foundation
MozTW,Mozilla 台灣社群