ionic中ng-repeat nav-direction不起作用的处理方法

这几天在弄ionic前端移动框架。遇到的问题
IONIC ng-repeat 数据的时候 nav-direction没有效果。折腾了好久,查了很多网站,都没有好的处理方法。最后…原来是ionic的一个bug.不过有看到用这样的代码来处理这个bug.试了之后success !!!!

1.首页你的html要这样写

<ion-item class="item-thumbnail-left item-icon-right" ng-repeat="g in goods" type="item-text-wrap"  on-tap='myHref(g.id)'>
                <img ng-src="{{g.thumb}}!100x100">
                <h2>{{g.title}}</h2>
                <p>{{g.sub_title}}</p>
            </ion-item>

这里推荐使用 collection-repeat 代替 ng-repeat 大量数据repeat的时候页面不会出现卡顿的现象。

2.在你的controller 中:

  $scope.myHref = function (route) {
                $ionicViewSwitcher.nextDirection('forward');
                $state.go('goods-detail', {'gid': route});
            }

别记了在你的controller 中注入 $ionicViewSwitcher,$state两个模块。
3.你的ionic 路由:

 .state('goods-detail', {
               url: '/:gid',
               templateUrl: 'templates/goods-detail.html',
               controller: 'GoodsDetailCtrl',
})

阿里云9折优惠推荐码:WR3WCX

阿里云9折优惠推荐码:WR3WCX

首次购买阿里云包年包月云服务器ECS和云数据库RDS时,使用推荐码可享受原价9折优惠
1、推荐码使用规则?
适用订单:首次购买包年包月云服务器ECS和云数据库RDS的订单
优惠折扣:享受原价9折优惠。
有效期: 推荐码限量限时,请尽快使用。
2、如何使用?
选好产品->立即购买->确认订单环节->点击「我有推荐码」->输入推荐码->立享9折!
TB1.8loIFXXXXcOXpXXkDxZRXXX-798-356

阿里云 OSS 图片上传iframe 实现异步上传

阿里云 OSS 图片上传iframe 实现异步上传 相关代码:
index.php:

<?php
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
if (isset($_POST) && !empty($_POST)) {
    echo "<pre>";
    var_dump($_POST);
    die;
}
?>
<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="http://filela.b0.upaiyun.com/js/jquery-1.9.0.min.js"></script>
    </head>
    <body>
        <h1>添加操作</h1>
        <form action="" method="post" >
            <iframe src="upload.php"  frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no" allowtransparency="yes"></iframe><br/>
            名称: <input type="text" value="" name="name">
            <div id="res"> </div>
 
            <input type="submit" value="submit" />
        </form>
 
    </body>
</html>

upload.php

<?php
$access_id = '';
$access_key = '';
$policy = '{"expiration": "2120-01-01T12:00:00.000Z","conditions":[{"bucket": "ioutsider" },["content-length-range", 0, 104857600]]}';
$policy = base64_encode($policy);
$signature = base64_encode(hash_hmac('sha1', $policy, $access_key, true));
$file_name = date('Y') . '/' . date('m') . '/' . md5(microtime(true)) . '.jpg';
//print_r(get_headers('http://ioutsider.oss-cn-shenzhen.aliyuncs.com')); 
?>
 
<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="http://filela.b0.upaiyun.com/js/jquery-1.9.0.min.js"></script>
    </head>
    <body>
        <form id="upload" action="http://ioutsider.oss-cn-shenzhen.aliyuncs.com" method="POST" enctype="multipart/form-data">
 
            <label for="file">选择文件:</label>
            <input type="hidden" name="OSSAccessKeyId" id="OSSAccessKeyId"  value="<?php echo $access_id; ?>" />
            <input type="hidden" name="policy" id="policy"  value='<?php echo $policy; ?>' />
            <input type="hidden" name="Signature" id="Signature"  value="<?php echo $signature; ?>" />
            <!--<input type="hidden" name="key" id="key"  value="upload/${filename}" />-->
            <input type="hidden" name="key" id="key"  value="<?php echo $file_name; ?>" />
            <input type="hidden" name="success_action_redirect" value="http://iphotos.me/res.php?img=<?php echo $file_name; ?>" />
            <input type="file" name="file" id="file" />
            <input type="submit" name="upload" value="上传" />
        </form>
    </body>
</html>

上传成功后跳转的页面:

<!DOCTYPE html>
<html>
    <head>  
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="http://filela.b0.upaiyun.com/js/jquery-1.9.0.min.js"></script>
    </head>
    <body>
        <?php $img = $_GET['img']; ?>
        <?php if ($img): ?>
            <img src='http://ioutsider.oss-cn-shenzhen.aliyuncs.com/<?php echo $img; ?>' width='200' height='200' />
            <script>
                $(function(){
                    alert('上传成功');
                    window.parent.$('#res').append("<input type='hidden' value='<?php echo $img ?>' name='path'>")
                })
            </script>
        <?php endif; ?>
    </body>
</html>

阿里云OSS 通过表单直接上传文件 Post Policy

<?php
$access_id = 'ACCESS_ID';
$access_key = 'OSS_ACCESS_KEY';
$url='http://ioutsider.oss-cn-shenzhen.aliyuncs.com';//更改成你自己的地址
$policy = '{"expiration": "2120-01-01T12:00:00.000Z","conditions":[{"bucket": "ioutsider" },["content-length-range", 0, 104857600]]}';
$policy = base64_encode($policy);
$signature = base64_encode(hash_hmac('sha1', $policy, $access_key, true));//生成认证签名
?>
<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <div>文件上传</div>
        <form action="<?php echo $url;?>" method="post" enctype="multipart/form-data">
            <label for="file">选择文件:</label>
            <input type="hidden" name="OSSAccessKeyId" id="OSSAccessKeyId"  value="<?php echo $access_id; ?>" />
            <input type="hidden" name="policy" id="policy"  value='<?php echo $policy; ?>' />
            <input type="hidden" name="signature" id="signature"  value="<?php echo $signature; ?>" />
            <input type="hidden" name="key" id="key"  value="${filename}" />
            <input type="file" name="file" id="file" />
            <br />
            <input type="submit" name="submit" value="确定" />
        </form>
    </body>
</html>

PHP QR Code生成二维码

在线生成URL:qr.outsiderla.me
HP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示demo,查看地址:http://phpqrcode.sourceforge.net/。
下 载官网提供的类库后,只需要使用phpqrcode.php就可以生成二维码了,当然您的PHP环境必须开启支持GD2。 phpqrcode.php提供了一个关键的png()方法,其中参数$text表示生成二位的的信息文本;参数$outfile表示是否输出二维码图片 文件,默认否;参数$level表示容错率,也就是有被覆盖的区域还能识别,分别是 L(QR_ECLEVEL_L,7%),M(QR_ECLEVEL_M,15%),Q(QR_ECLEVEL_Q,25%),H(QR_ECLEVEL_H,30%); 参数$size表示生成图片大小,默认是3;参数$margin表示二维码周围边框空白区域间距值;参数$saveandprint表示是否保存二维码并 显示。
. 代码如下:

public static function png($text, $outfile=false, $level=QR_ECLEVEL_L, $size=3, $margin=4, $saveandprint=false)    
{   
    $enc = QRencode::factory($level, $size, $margin);   
    return $enc-&gt;encodePNG($text, $outfile, $saveandprint=false);   
}

调用PHP QR Code非常简单,如下代码即可生成一张内容为”http://www.cnblogs.com/txw1958/”的二维码.

include 'phpqrcode.php'; 
QRcode::png('http://www.cnblogs.com/txw1958/');

那么实际应用中,我们会在二维码的中间加上自己的LOGO,已增强宣传效果。那如何生成含有logo的二维码呢?其实原理很简单,先使用PHP QR Code生成一张二维码图片,然后再利用php的image相关函数,将事先准备好的logo图片加入到刚生成的原始二维码图片中间,然后重新生成一张新 的二维码图片。
. 代码如下:

include 'phpqrcode.php';    
$value = 'http://www.cnblogs.com/txw1958/'; //二维码内容   
$errorCorrectionLevel = 'L';//容错级别   
$matrixPointSize = 6;//生成图片大小   
//生成二维码图片   
QRcode::png($value, 'qrcode.png', $errorCorrectionLevel, $matrixPointSize, 2);   
$logo = 'logo.png';//准备好的logo图片   
$QR = 'qrcode.png';//已经生成的原始二维码图   
 
if ($logo !== FALSE) {   
    $QR = imagecreatefromstring(file_get_contents($QR));   
    $logo = imagecreatefromstring(file_get_contents($logo));   
    $QR_width = imagesx($QR);//二维码图片宽度   
    $QR_height = imagesy($QR);//二维码图片高度   
    $logo_width = imagesx($logo);//logo图片宽度   
    $logo_height = imagesy($logo);//logo图片高度   
    $logo_qr_width = $QR_width / 5;   
    $scale = $logo_width/$logo_qr_width;   
    $logo_qr_height = $logo_height/$scale;   
    $from_width = ($QR_width - $logo_qr_width) / 2;   
    //重新组合图片并调整大小   
    imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,   
    $logo_qr_height, $logo_width, $logo_height);   
}   
//输出图片   
imagepng($QR, 'helloweixin.png');   
echo '<img src="helloweixin.png" alt="" />';

由于二维码允许有一定的容错性,一般的二维码即使在遮住部分但仍然能够解码,经常我们扫描二维码的时候扫描到甚至不到一半时就能解码扫描结果,这是因为生成器会将部分信息重复表示来提高其容错度,这就是为什么我们在二维码中间加个LOGO图片并不影响解码结果的原因。

最后上自己的代码 :

&lt;?php
 
include "qrlib.php";
$data = "http://outsiderla.me"; // 二维码数据
$errorCorrectionLevel = "M"; // 纠错级别:L、M、Q、H
$matrixPointSize = 10; // 点的大小:1到10
$filename = "test.png"; // 生成的文件路径
QRcode::png($data, $filename, $errorCorrectionLevel, $matrixPointSize, 2); //在$filename处生成一张图片
 
 
$logo = 'log.JPG';
$QR = 'test.png';
 
if ($logo !== FALSE) {
 
    $QR = imagecreatefromstring(file_get_contents($QR));
    $logo = imagecreatefromstring(file_get_contents($logo));
    $QR_width = imagesx($QR);
    $QR_height = imagesy($QR);
    $logo_width = imagesx($logo);
    $logo_height = imagesy($logo);
    $logo_qr_width = $QR_width / 5;
    $scale = $logo_width / $logo_qr_width;
    $logo_qr_height = $logo_height / $scale;
    $from_width = ($QR_width - $logo_qr_width) / 2;
    imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
}
imagepng($QR, 'test.png');
$image = fread(fopen($filename, r), filesize($filename));
header("Content-type: image/JPEG", true);
 
echo $image; //此处为了显示在页面上

来自:http://www.cnblogs.com/txw1958/p/phpqrcode.html

ajax jsonp

 $.ajax(  
        {  
            data:'',
            type:'post',  
            url : 'http://demo.test.com?page=2',  
            dataType : 'jsonp',  
            jsonpCallback:"jsoncallback", 
            success  : function(data) {  
               alert(data.page);
            }
 
        }

php:

header('Content-Type:text/html;Charset=utf-8');  
$arr = array(
    "user" => '222',
    "pass" => '333',
    "name" => 'response',
    'page'=>$_GET['page']
);
echo $_GET['callback'] . "(" . json_encode($arr) . ")";
die;

flex+fms ShareObject简单在线聊天

flex fms ShareObject实现的在线聊天
flex代码:

<?xml version="1.0" encoding="utf-8"?>   
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" backgroundColor="white" layout="vertical" initialize="BasicPracticeSO();">   
	<mx:Script>   
		<![CDATA[   
			private var nc:NetConnection;   
			private var shareObject:SharedObject;   
			private var monthDay:Date;   
			private var isConnectSuccess:Boolean;   
			private static const RTMP_URL:String="rtmp://localhost/chat";   
 
 
			private function BasicPracticeSO():void{   
				nc=new NetConnection;   
				nc.connect(RTMP_URL);   
				nc.addEventListener(NetStatusEvent.NET_STATUS,operateShareObject);   
			}   
 
			private function operateShareObject(evt:NetStatusEvent):void{   
				isConnectSuccess=(evt.info.code=="NetConnection.Connect.Success");   
				if(isConnectSuccess){   
					shareObject=SharedObject.getRemote("userInfo",nc.uri,false);   
					monthDay=new Date();   
					shareObject.connect(nc);   
					shareObject.addEventListener(SyncEvent.SYNC,detectSO);   
				}   
			}   
 
			private function detectSO(e:SyncEvent):void{   
				for(var chng:uint;chng<e.changeList.length;chng++){   
					switch(e.changeList[chng].code){   
						case "change":   
							updateAllClientMsg();   
							break;   
						case "clear":   
							break;   
						case "success":   
							break;   
						default:   
							break;   
					}   
				}   
			}   
 
			private function updateAllClientMsg():void{   
				soList.text+=shareObject.data.msg+"\n";   
			}   
 
 
			private function addDataToShareObject():void{   
				shareObject.setProperty("msg",msgText.text);   
				soList.text+=msgText.text+"\n";   
				msgText.text="";   
			}   
		]]>   
	</mx:Script>   
	<mx:Label text="ShareObject data:"/>   
	<mx:TextArea id="soList" width="300" height="120">   
 
	</mx:TextArea>   
	<mx:Form>   
		<mx:FormHeading label="add data to ShareObject:"/>   
		<mx:FormItem label="msg:">   
			<mx:TextInput id="msgText"/>   
		</mx:FormItem>   
		<mx:FormItem>   
			<mx:Button label="send Msg" click="addDataToShareObject();"/>   
		</mx:FormItem>   
	</mx:Form>   
</mx:Application>

FMS 代码:

Client.prototype.echo = function(msg){
	trace("client.echo: " + msg);
	return msg;
}

flex+fms实现的简单直播

直播端相关record.mxml代码:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
			   creationComplete="initApp()">
	<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
	</fx:Declarations>
	<fx:Script>
		<![CDATA[
			import flash.media.Camera;
			import flash.media.Video;
			import flash.net.NetConnection;
			import flash.net.NetStream;
 
			import mx.controls.Alert;
 
			private var vi:Video;//播放器
 
			private var cam:Camera;//摄像头
 
			private var inStream:NetStream; //网络流
 
			private var outStream:NetStream; //网络输出流
 
			private var nc:NetConnection; //网络连接
 
			private var myCamera:Camera;
 
			private var connectionURL:String="rtmp://localhost/chat/01"; //FMS媒体服务器地址
			/*连接媒体服务器*/
			private function initApp():void
			{
				//显示自己的视频
				myCamera = Camera.getCamera();
				if(myCamera != null)
				{
					this.myVideo.attachCamera(myCamera);
				}
				else
				{
					Alert.okLabel="确 定";
					Alert.show("没检测到视频摄像头!","系统提示");
				}
			}
 
			/*连接媒体服务器*/
			protected function connectFMS():void
			{
 
				nc=new NetConnection(); //创建连接对象
 
				nc.client=this; //将客户端设置为本地
 
				nc.connect(connectionURL); //第一个参数是连接地址,后面是账号密码(可省略)
 
				nc.addEventListener(NetStatusEvent.NET_STATUS, ncHandler);//流状态侦听器
 
				recordStatus.text='直接中...';
 
			}
 
			//判断FMS服务器连接
			protected function ncHandler(evt:NetStatusEvent):void
			{
				if (evt.info.code == "NetConnection.Connect.Success")
				{
					//开始录制
					beginRec();
				}
				else
				{
					Alert.show("连接失败", "提示");
				}
			}
 
			//开始录制
			protected function beginRec():void
			{
				cam=Camera.getCamera();
				cam.setMode(320, 240, 30);//大小与帧率
				cam.setQuality(0, 100); //设置清晰度  
				outStream=new NetStream(nc);
				outStream.client=this;//将客户端设置为this,如有特殊需求可以写一个自定义的client,比如传播文本信息
				outStream.attachCamera(cam);//激活视频
				outStream.publish("1111", "live");//第二个参数live代表实况流,当连接中断后,在FMS流媒体服务器中不会残留视频文件
			}
 
			//停止录制
			protected function endRec():void
			{
				outStream.close();
				recordStatus.text='无直播';
			}
		]]>
	</fx:Script>
 
	<s:Button x="240" y="127" label="开始直播"  click="connectFMS()" />
	<s:Button x="484" y="127" label="关闭直播" click="endRec()"/>
	<mx:VideoDisplay id="myVideo" x="178" y="156" width="426" height="347"/>
	<s:Label id="recordStatus" x="174" y="63" width="290" height="30" chromeColor="#440EF3"
			 fontSize="19" fontWeight="bold" text="无直播"/>
</s:Application>

接收端player.mxml代码:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
			   creationComplete="initApp()">
	<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
	</fx:Declarations>
	<fx:Script>
		<![CDATA[
		import flash.media.Video;
		import flash.net.NetConnection;
		import flash.net.NetStream;
 
		import mx.controls.Alert;
 
		private var conn:NetConnection; //网络连接
		private var inStream:NetStream; //网路接受流
		private var outStream:NetStream; //网路输出流
		private var connectName:String="1111"; //网络连接名称只有相同的链接名称才能对应相同的发布方视频流
		private var serverURL:String="rtmp://localhost/chat/01"; //FMS服务器地址
		private var vi:Video;
 
		private function initApp():void
		{
			conn=new NetConnection();
			conn.client=this;
			conn.connect(serverURL);
			conn.addEventListener(NetStatusEvent.NET_STATUS, connHandler); //添加网络监听事件
		}
 
		//链接FMS服务器
		private function connectServer():void
		{
			conn=new NetConnection();
			conn.client=this;
			conn.connect(serverURL);
			conn.addEventListener(NetStatusEvent.NET_STATUS, connHandler); //添加网络监听事件
		}
		private function connHandler(evt:NetStatusEvent):void
		{
		if (evt.info.code == "NetConnection.Connect.Success")
		{
		    getVideo();
		}
		else
		{
		    Alert.show("网络连接失败!", "提示");
		}
		}
		//开始接受视频
		private function getVideo():void
		{
			inStream=new NetStream(conn);
			inStream.addEventListener(NetStatusEvent.NET_STATUS, inStreamHandler);
			inStream.client=this;
			inStream.play(connectName); //1111为流的名字,对应于视频流发布端的publish("1111","live").
			vi=new Video();
			vi.width=viewDisplay.width;
			vi.height=viewDisplay.height;
			vi.smoothing=true;
			vi.attachNetStream(inStream);
			viewDisplay.addChild(vi);
		}
 
		private function stopVideo():void{
			inStream.close();
			conn.close();
			viewDisplay.removeChild(vi);
		}
		private function inStreamHandler(evt:NetStatusEvent):void
		{
 
		}
		]]>
	</fx:Script>
	<mx:VideoDisplay id="viewDisplay" x="178" y="173" width="429" height="333"/>
</s:Application>

flex 链接 fms 相关代码

Flex与FMS建立连接的相关代码:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
	<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
	</fx:Declarations>
	<fx:Script>
		<![CDATA[
		import mx.controls.Alert;
		//Flex与FMS建立连接的对象
		private var nc:NetConnection;
		//FMS服务器的地址,使用rtmp协议
		private var rtmpUrl:String="rtmp://localhost/chat";
		//当Flex应用程序启动的时候就建立与FMS服务器的连接
		internal function connect():void
		{
		nc = new NetConnection();
		nc.connect(rtmpUrl);
		nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);
		nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR,onAsyncErrorHandler);
		}
 
		private function onNetStatusHandler(evt:NetStatusEvent):void
		{
		switch (evt.info.code)
		{
		case "NetConnection.Connect.Success":
		Alert.show("成功连接FMS服务器!");
		break;
		case "NetConnection.Connect.Rejected":
		Alert.show("访问FMS服务器权限不足,连接被拒绝!");
		break;
		case "NetConnection.Connect.InvalidApp":
		Alert.show("指定的应用程序名称没有找到");
		break;
		case "NetConnection.Connect.Failed":
		Alert.show("连接失败!");
		break;
		case "NetConnection.Connect.AppShutDown":
		Alert.show("服务器端应用程序已经关闭(由于资源耗用过大等原因)或者服务器已经关闭!");
		break;
		case "NetConnection.Connect.Closed":
		Alert.show("与FMS的连接中断!");
		break;
		}
		}
 
		private function onAsyncErrorHandler(evt:AsyncErrorEvent):void
		{
 
		}
		]]>
	</fx:Script>
	<s:Button x="362" y="232" label="按钮" click="connect()" />
</s:Application>

js 调用打印机

 
<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
        <meta name="apple-mobile-web-app-capable" content="yes" /> 
        <script src="http://cdn.outsiderla.me/js/jquery-1.6.4.min.js"></script>
 
        <style media=print type="text/css">
            .noprint{visibility:hidden}
        </style> 
    </head>
    <body>
        要打印的内容
        <p class="noprint">将不打印的代码放在这里。</p>
        <a href="#" class="print">打印</a>
 
        <hr/>
        <span id='div1'>把要打印的内容放这里</span>
        <p>所有内容</p>
        <div id="div2">div2的内容</div>
        <a href="#" id="print">打印</a>
        <script>
            $(function(){
                $('.print').click(function(){
                    window.print()
                })
                $('#print').click(function(){
                    document.body.innerHTML=document.getElementById('div1').innerHTML+'<br/>'+document.getElementById('div2').innerHTML;
                    window.print();
                })
 
            })
 
        </script>
    </body>
</html>

正则表达式

用于正则表达式的通配符:
 
\d   匹配数字0-9
 
\D   匹配任何非数字字符
 
\w   匹配单词字符, 包括大小写字母a-z, 
 
A-Z, 数字0-9和下划线_
 
\W   匹配任何非单词字符
 
\s   匹配任何空白字符, 包括空格 制表符 
 
换页符(即匹配\n \r \v \f 以及空格)
 
\S   匹配任何非空白字符
 
.    匹配除换行符(\n)之外的任何字符
 
 
可选字符集     [] 
 
[abc]    表示该位置可以出现字母a b c
 
[A-D]    表示该位置可以出现字母A B C D
 
[A-DM-P] 表示该位置可以出现字母A到D或M
 
到P
 
[12]     表示该位置可以出现数字12
 
[1-5]    表示该位置可以出现数字15
 
[0-57-9] 表示该位置可以出现除6以外的所
 
有数字
 
[\s\S]   表示该位置可以出现任何字符, 
 
包括任何可见字符和不可见字符
 
反向字符集  ^
 
[^x]    匹配除x以外的所有字符
 
[^abc]  匹配除a b c 以外的所有字符
 
[^0-9]  匹配除0-9以外的所有字符
 
[^#]    匹配除#以外的所有字符

[^\n]   匹配除换行符\n以外的所有字符
 
 
或匹配    |
 
"x|y"       匹配"x""y"
"(tr|b)ee"  匹配tree或bee
 
 
数量限定符  *  +  {}  ?
 
*      将前面的字符重复0或多次
 
+      将前面的字符重复1或多次
 
?      将前面的字符重复01次
 
{n}    将前面的字符重复n次
 
{n,}   将前面的字符至少重复n次
 
{n,m}  将前面的字符重复n至m次
 
*?     将前面的字符重复0或多次, 尽量少
 
重复
 
+?     将前面的字符重复1或多次, 尽量少
 
重复
 
??     将前面的字符重复01, 尽量少
 
重复
 
{n}?   将前面的字符重复n次, 尽量少重复
 
{n,}?  将前面的字符至少重复n次, 尽量少
 
重复
 
{n,m}? 将前面的字符重复n至m次, 尽量少
 
重复
 
 
定位符: ^   &   \b
 
^   匹配字符串的开头位置
 
&   匹配字符串的结尾位置
 
\b  匹配单词的边界位置
 
\B  匹配不是单词的边界位置
 
\G  匹配上一个匹配结果的位置
 
\A  匹配字符串开头位置, 类似^
 
\Z  匹配字符串结尾位置或换行符所在的位
 
置
 
\z  匹配字符串结尾位置, 类似&
 
 
分组  ():
asdfgas@qq.com
可以通过下面的正则表达式来匹配,
"(\w+)@(\w+)\.(\w+)"
()将上面的正则表达式分成3组
下面的正则表达式有5, 最外面的括弧为
 
第一组,最里面的括弧为第四和第五组
"( ( ) ( ( ) ( ) ) )"
 
 
非捕获分组 ?:
正向预查   ?=
反向预查   ?<=
负正向预查 ?!
负反向预查 ?<!