2018年6月20日 星期三

Regular Expression 正則表示式做字串比對

Regular Expression 中文翻成正則表示式
英文簡寫為 Regex 或 RegExp
RegExp 是用來比對字串是不是有符合正確的格式
語法很簡單而且大部分語言都有支援它

使用時機

譬如說你需要在程式內請使用者輸入生日
你規定的格式
  • 1996-08-06
但使用者可能會不小心輸成其他格式
  • 19960806
  • 1996-8-6
  • 85-08-06
  • 850806
如果要寫程式來過濾這些格式恐怕要寫很多判斷式
這時候就可以用 Regexp 來驗證字串格式

語法

字元

a: a 這個字元
0: 0 這個字元
.: 任意字元
RegExp說明範例
/a/含有字母 a 的字串"a","apple"
/./含有任意字元的字串"aaa","a","嗨"
/a./含有字母 a 後面接一個任意字元的字串"aaa","apple"

次數

*: 出現 0 次以上
?: 出現 0 次或 1 次
+: 出現一次以上

{2}: 出現兩次
{2,}: 出現兩次以上
{,10}: 出現十次以下
{2,5}: 出現兩次到五次
RegExp說明範例
/a*/包含 0 次以上的 a"apple","hello"
/ab*/包含一個 a,後面至少 0 個 b"a","ab"
/a?/包含空字串或一個 a"c","","app"
/123a+/包含 123 後面有一個以上的 a"123a","123app"
/123a{1,2}/包含 123 後面出現一個或兩個 a"1123a","123aaa"

頭尾

^: 開頭
$: 結尾
RegExp說明範例
/^app/開頭是 app 的字串"app","apple"
/ry$/結尾是 ry 的字串"Larry"
/^abcd$/開頭結尾中間只有 abcd 的字串"abcd"
/^La.*le$/開頭是 La 尾巴是 le 的字串"Larry loves apple"

比對多個字元

[]: 括號內的任何字元
[^]: 不在括號內的任何字元
RegExp說明範例
/^[aeiou]/開頭是小寫母音的字串"apple","oh"
/[^aeiouAEIOU]$/結尾不是母音的字串"Larry","ok"
/^[aeiou]{3}$/三個小寫母音組成的字串"aaa","aeu"
/^[^aeiou]*$/不包含小寫母音的字串"hEllO","ApplE"
/[0-9]/含數字的字串"app1e","123"
/[a-z]/含小寫字母的字串"12a45","aaa"
/^[^a-zA-Z]$/不含英文字母的字串"123","345"

特殊字元

\.: "." 這個字元,直接寫 /./ 會被判斷成任意字元
\+: "+" 這個字元,類似的還有 \?, \*
\(: "(" 這個字元,類似的還有 \), \[, \]
\\: "\" 這個字元

\d: 任何數字字元,等同 [0-9]
\D: 任何非數字字元,等同 [^0-9]
\w: 任何數字字母底線,等同 [A-Za-z0-9_]
\W: 任何非數字字母底線,等同 [^A-Za-z0-9_]
\s: 任何空白字元(空白,換行,tab),等同 [ \f\n\r\t\v]
\S: 任何非空白字元(空白,換行,tab),等同 [^ \f\n\r\t\v]

實例

RegExp說明範例
/^\d{4}-\d{2}-\d{2}$/西元生日格式"1996-08-06"
/^[A-Z]\d{9}$/身分證字號"A123456789"
/^09\d{8}$/手機號碼"0912345678"
/^[^aeiou]*$/不包含小寫母音的字串"hEllO","ApplE"
/^.*@gmail\.com$/gmail 信箱"test@gmail.com"
/^[0-9\+\-\*\/]*$/四則運算算式"1+2*3"

在各語言中使用

C++

註: C++ 11 才開始支援 regex
#include<regex>
#include<string>
using namespace std;

int main(){
    regex pattern("^[0-9]{4}-[0-9]{2}-[0-9]{2}$");
    string str = "1996-08-06";

    if(regex_match(str, pattern)){
        // doSomething
    }
}

Java

public class Example {
    public static void main(String[] args) {
        String pattern = "^[0-9]{4}-[0-9]{2}-[0-9]{2}$";
        String str = "1996-08-06";

        if(str.matches(pattern)){
            //doSomething
        }
    }
}

JavaScript

var pattern = new RegExp('[0-9]{4}-[0-9]{2}-[0-9]{2}');
var str = '1996-08-06';

if(str.match(pattern)){
    // doSomething
}

結論

Regular Expression 是個很好用的工具 剛學可能會覺得有點複雜
用久了之後就會覺得很好用
而且也可以搭配 sed 跟 grep 做取代、搜尋的工作
可以省下不少時間

這篇只介紹比較常用的一些表示法
如果想知道更深入的可以再到網路上去查

2018年6月8日 星期五

PHP : getdate

PHP : getdate



定義和用法

getdate() 函數取得日期/時間信息。

語法

getdate(timestamp)
參數描述
timestamp可選。規定Unix 時間格式中的時間。

說明

返回一個根據timestamp得出的包含有日期信息的結合數組。如果沒有給出時間戳,則認為是當前本地時間。
數組中的單元如下:
鍵名說明返回值例子
"seconds"秒的數字表示0 到59
"minutes"分鐘的數字表示0 到59
"hours"小時的數字表示0 到23
"mday"月份中第幾天的數字表示1 到31
"wday"星期中第幾天的數字表示0(表示星期天)到6(表示星期六)
"mon"月份的數字表示1 到12
"year"4 位數字表示的完整年份例如:1999 或2003
"yday"一年中第幾天的數字表示0 到365
"weekday"星期幾的完整文本表示Sunday 到Saturday
"month"月份的完整文本表示January 到December
0自從Unix 紀元開始至今的秒數,和time() 的返回值以及用於date() 的值類似。系統相關,典型值為從-2147483648 到2147483647。

例子

例子 1

<?php
print_r(getdate());
?>
輸出:
Array
(
[seconds] => 45
[minutes] => 52
[hours] => 14
[mday] => 24
[wday] => 2
[mon] => 1
[year] => 2006
[yday] => 23
[weekday] => Tuesday
[month] => January
[0] => 1138110765
)

例子 2

<?php
$my_t=getdate(date("U"));
print("$my_t[weekday], $my_t[month] $my_t[mday], $my_t[year]");
?>
輸出:
Wednesday, Janua

2018年6月1日 星期五

cordova 筆記

[Android 模擬器] Genymotion
https://www.genymotion.com/account/create/
tomz50/tomz10750

tomz50@gmail.com


----
1.安裝 node.js / node-v8.11.1-x64
2.安裝 java.jdk 1.8版本
3.設PATH 路徑參數
2.安裝 apache-ant / 解壓 apache-ant-1.9.11-bin.zip 到 d:\apache-ant 資料夾
5.建立cordova環境,導入專案
6.建立android studio 裡的模擬器環境
7.將要編譯成APK的完整網頁(含HTML/CSS/IMAGES),複製到 D:\cordova\blogapp\www\ 資料夾
8.D:\cordova\blogapp>cordova build android 進行編譯成APK
9.將 D:\cordova\blogapp\platforms\android\app\build\outputs\apk\debug\app-debug.apk
拖曳到模擬器執行

10. create/add/build --> 生成apk -> 丟到模擬器RUN
11. cordova 步驟 :

(1)D:\cordova>cordova create myapp com.macroviz.myapp myapp
(2)D:\cordova\myapp>cordova platform add android
(3)D:\cordova\myapp>cordova build android

www 存放位置 : D:\cordova\myapp\www
apk 存放位置 : D:\cordova\myapp\platforms\android\app\build\outputs\apk\debug

----

ANDROID_HOME   C:\Users\user\AppData\Local\Android\sdk
ANT_HOME D:\apache-ant-1.9.7
JAVA_HOME C:\Program Files\Java\jdk1.8.0_171


PATH=
C:\Program Files (x86)\Common Files\Oracle\Java\javapath;
C:\Program Files\Java\jdk1.8.0_171\bin;
C:\Program Files\nodejs\;D:\javaScript\apache-ant-1.9.7\bin;
C:\Users\user\AppData\Local\Android\sdk\tools;
C:\Users\user\AppData\Local\Android\sdk\platform-tools;
D:\apache-ant-1.9.11\bin



cordova -v 版本
ant -version

cordova 只支援JAVA 1.8版本,先移除較新的版本,安裝1.8版
D:\cordova\blogapp>java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)



C:\Program Files\Java\jdk-10\bin;
C:\nodejs\;
%ANT_HOME%\bin;
%ANDROID_HOME%\tools;
%ANDROID_HOME%\platform-tools;


set path=
C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Java\jdk-10\bin;%ANT_HOME%\bin;%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;C:\xampp\php;C:\ProgramData\ComposerSetup\bin;D:\apache-ant-1.9.11\bin;C:\nodejs\;C:\Users\Administrator\AppData\Roaming\npm\node_modules\cordova\bin;C:\Program Files\Java\jdk1.8.0_171



移到你想建立專案的目錄下。
使用指令建立專案,建立在目前的位置上。
建立一個 D:\cordova\ 資料夾

**一定要在 D:\cordova 資料夾下執行以下指令
D:\cordova>cordova create myapp com.macroviz.myapp myapp
Creating a new cordova project.


會建立一個 D:\cordova\blogapp\ 資料夾

將專案加入平台,平台指的是你的App之後要執行在哪,以Android為例,使用指令完成。
cordova platform add android

為專案加入作業系統台
**一定要在 D:\cordova\blogapp 資料夾下執行以下指令
D:\cordova\blogapp>cordova platform add android         
Using cordova-fetch for cordova-android@~7.0.0
Adding android project...
Creating Cordova project for the Android platform:
        Path: platforms\android
        Package: com.macroviz.blogapp
        Name: blogapp
        Activity: MainActivity
        Android target: android-26
Subproject Path: CordovaLib
Subproject Path: app
Android project created with cordova-android@7.0.0
Android Studio project detected
Android Studio project detected
Discovered plugin "cordova-plugin-whitelist" in config.xml. Adding it to the project
Installing "cordova-plugin-whitelist" for android

               This plugin is only applicable for versions of cordova-android greater t
han 4.0. If you have a previous platform version, you do *not* need this plugin since t
he whitelist will be built in.

Adding cordova-plugin-whitelist to package.json
Saved plugin info for "cordova-plugin-whitelist" to config.xml
--save flag or autosave detected
Saving android@~7.0.0 into config.xml file ...

D:\cordova\blogapp>cordova platform rm android
Removing platform android from config.xml file...
Removing android from cordova.platforms array in package.json




生成Android專案
D:\cordova\blogapp>cordova build android
.....
:app:cdvBuildDebug

BUILD SUCCESSFUL in 20m 33s
47 actionable tasks: 47 executed
Built the following apk(s):
        D:\cordova\blogapp\platforms\android\app\build\outputs\apk\debug\app-debug.apk

Regular Expression 正則表示式做字串比對

Regular Expression 中文翻成正則表示式 英文簡寫為 Regex 或 RegExp RegExp 是用來比對字串是不是有符合正確的格式 語法很簡單而且大部分語言都有支援它 使用時機 譬如說你需要在程式內請使用者輸入生日 你規定的格式 1996-08...