問題提出:將格式為:"25/10/2009"的時間轉換為"2009-10-25"的格式
問題分析:
1、年份2009、月份10、日25應該做為一個獨立的單位,這樣我們可以直接知道什么地方匹配的是年、月還是日
2、可以用\d\d\d\d來匹配年份,用\d\d來匹配月份,用\d\d來匹配日
3、應該可以有一個地方存儲匹配過的結果,以便于轉換
解決問題所必須知道的:
1、分組就是將若干單位(可以是字符,正則表達式等等)組織在一起,成為一個獨立的單元,該單位可以跟獨立的字符一樣,受量詞的控制,分組使用()表示
2、分組分為捕獲性分組和非捕獲性分組,簡單的說捕獲性分組就是捕獲分組所匹配的內容暫且存儲在某個地方,以便下次使用,捕獲性分組以(...)表示,有些地方將取得捕獲性分組所匹配結果的過程稱之為"反向引用",非捕獲性分組不捕獲分組所匹配的內容,當然也就得不到匹配的結果,非捕獲性分組以(?:...)表示,在一些只需要分組匹配但是并不需要得到各個分組匹配的結果時,使用非捕獲性分組可以提高匹配速度。
3、在JavaScript和Java中,捕獲性分組所匹配的內容都是以$1,$2,$3...的格式保存的!
解決問題:
1、初步表達式:(\d\d)/(\d\d)/(\d\d\d\d),第一個分組(\d\d)表示日,第二個分組(\d\d)表示月,最后一個分組(\d\d\d\d)表示年
2、取得匹配后的結果:
在JavaScript中,分組匹配的結果是存儲在RegExp中的,可以通過RegExp.$1,RegExp.$2...來取得相應的分組匹配結果
<script type="text/javascript">
<!--

window.onload = function()
{
var now = "25/10/2009";
/(\d\d)\/(\d\d)\/(\d\d\d\d)/.test(now);
alert(RegExp.$1); //25
alert(RegExp.$2); //10
alert(RegExp.$3); //2009
}
//-->
</script>
在Java中,可以通過Matcher的group(int)方法來取得:
String now = "25/10/2009";
Matcher matcher = Pattern.compile("(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)").matcher(now);

if (matcher.find())
{
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));
}
注意:在String的replace()方法中,也可以直接以$1,$2...的格式來取得匹配結果
3、轉換:
JavaScript:
<script type="text/javascript">
<!--

window.onload = function()
{
var now = "25/10/2009";
/(\d\d)\/(\d\d)\/(\d\d\d\d)/.test(now);
alert(RegExp.$3+"-"+RegExp.$2+"-"+RegExp.$1); //2009-10-25
}
//-->
</script>
Java:
String now = "25/10/2009";
Matcher matcher = Pattern.compile("(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)").matcher(now);

if (matcher.find())
{
System.out.println(matcher.group(3) + "-" + matcher.group(2) + "-" + matcher.group(1));
}
4、一個簡單的寫法:
JavaScript:
<script type="text/javascript">
<!--

window.onload = function()
{
var now = "25/10/2009";
alert(now.replace(/(\d\d)\/(\d\d)\/(\d\d\d\d)/,"$3-$2-$1")); //2009-10-25
}
//-->
</script>
Java:
String now = "25/10/2009";
System.out.println(now.replaceAll("(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)", "$3-$2-$1"));
5、分組結果量詞使用
上文提到,分組是可以結合量詞使用的,所以上面的程序也可以這樣來寫:
JavaScript;
<script type="text/javascript">
<!--

window.onload = function()
{
var now = "25/10/2009";

alert(now.replace(/(\d
{2})\/(\d
{2})\/(\d
{4})/,"$3-$2-$1")); //2009-10-25
}
//-->
</script>
Java:

String now = "25/10/2009";
System.out.println(now.replaceAll("(\\d{2})/(\\d{2})/(\\d{4})", "$3-$2-$1"));
拋磚引玉,希望對您有所幫助!
內容原創,轉載請注明出處!
posted on 2009-10-25 13:01
零全零美 閱讀(3978)
評論(2) 編輯 收藏 所屬分類:
正則表達式