正则表达式学习摘录
1.正则表达式匹配匹配结果,只包括匹配上的部分,不包括整个字符串,
如果需要把整个字符串传递到后续处理时,需要注意。
2.字符点(.)可以匹配任何一个字符,可以在正则表达式中多次出现。
3.[]中的字符,代表字符集,如[ns]将匹配n或者s字符
4.^符号,代表取非操作
5.\b 回退符 \f 换页符 \n 换行符 \r 回车符 \t 制表符(TAB) \v 垂直制表符
6.\d 任何一个数字,\D 任何一个非数字
7.\w 任何一个字母,数字字符,\W 任何一个非字母,非数字字符
8.\s 任何一个空白字符,\S 任何一个非空白字符
9.{}中的哦数字,代表匹配的重复次数
10.{2,4}的含义最少重复2次,最多重复4次
11.?代表出现0次或1次
12.*,+号等匹配时默认都是贪婪型元素符,如
测试文字:<b>hello</b><b>world</b>
采用此正则<[Bb]>.*</[Bb]>匹配时,会从头匹配到结尾,结果是
<b>hello</b><b>world</b>
但我们不需要这种贪婪型匹配时,需要加载*号,将其变成懒惰型,改成
<[Bb]>.*?</[Bb]>,此时的匹配结果如下:
【匹配结果:2】
(1)<b>hello</b>
(2)<b>world</b>
13.位置匹配
\b 单词边界,如\bcat\b,将在文本中只匹配cat单词
^匹配字符串开头
$匹配字符串结尾
(?m) 表示分行匹配模式,^和$可以匹配每一行的开始和结尾
14.子表达式,子表达式用()括起来即可
15.回溯引用 \1 代表在正则中出现的第一个表达式
16.替换中使用$1表示正则中的第一个表达式、
17.前后查找,?=表示向前查找,只找到对应值,但不出现到匹配结果里; ?<= 表示向后查找
Android NDK介绍及JNI调用
Android NDK是用来编译能在手机ARM平台上运行的,通过C/C++编写的LIB库。
注:理论上不只在ARM平台,以后应该也能在Intel x86平台上运行的。
JNI调用,是为了使java能够调用C/C++所编写的程序的一种机制。
Android NDK和JNI调用结合,就能够使Android程序,调用原生底层用C/C++实现的功能。
1.NDK开发环境配置
在Windows下开发需要安装Cygwin,安装时除了默认选择项外,还要选中gcc和make.
在Linux下,如Ubuntu,通过apt-get 安装gcc和make即可。
然后下载NDK,解压到特定的目录(如:D:\Android)
由于awt兼容性的问题,需要将D:\Android\android-ndk-r7\prebuilt\windows\bin中的awt.exe改为awt_.exe.
同时把D:\Android\android-ndk-r7加入到系统的PATH中,方便使用,
打开Cygwin,cd到/cygdrive/d/Android/android-ndk-r7/samples/hello-jni/jni目录,输入ndk-build,测试环境是否正常
出现以上显示的内容,即表示环境配置正常。
注:/cygdrive/d/即表示windows中的D盘。
2.开发Android测试程序
新建一个Android项目hello,包名com.hello
把自动生成的HelloActivity中修改为以下内容
public class HelloActivity extends Activity {
private static final String TAG = "Hello";
static {
System.loadLibrary("hello");
}
private native String printJNI();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(TAG, printJNI());
}
}
通过System.loadLibrary(“hello”)加载C编写的LIB,并定义native方法printJNI,最后调用printJNI()方法测试。
3.开发C语言程序,并通过NDK编译
在新建在helo项目的根目录下新建jni目录,如D:\MyWorkSpace3\hello
打开终端,转到D:\MyWorkSpace3\hello\,执行
javah -classpath bin/classes -d jni com.hello.HelloActivity
执行成功后,会在jni目录下生成com_hello_HelloActivity.h头文件;
接着在jni目录下新建一个C文件com_hello_HelloActivity.c,编写如下代码:
#include "com_hello_HelloActivity.h"
#define LOG_TAG "JNITest"
#undef LOG
JNIEXPORT jstring JNICALL Java_com_hello_HelloActivity_printJNI
(JNIEnv * env, jobject obj)
{
return (*env)->NewStringUTF(env, (char *)"JNITest Native String");
}
再在jni目录下新建一个Android.mk文件,用于配置编译的文件及选项
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello LOCAL_SRC_FILES := com_hello_HelloActivity.c include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH指编译文件的目录,$(call my-dir)指向当前目录
LOCAL_MODULE指定编译生成的lib名字
LOCAL_SRC_FILES指需要编辑的源文件,可自动多个文件,换行时用\分隔
完成后打开Cygwin,cd到项目的jni目录下,
比如/cygdrive/d/MyWorkSpace3/hello/jni
执行ndk-build

生成的lib文件会安装到\libs\armeabi下,名称为libhello.so,但注意在java加载中只用写hello作为lib名称就可以了。
4.检测执行结果
在eclipse中刷新项目,运行,在logcat中应该可以看到“JNITest Native String”
项目附件:hello.zip
新浪SAE python试用
新浪目前提供SAE python版本的内测,内测帐号可以到http://appstack.sinaapp.com/queue申请,
一般估计5分钟左右就可以开通了,开通后没有任何提示,你要自己去SAE里新建项目,看能不能新建python项目了
通过sae python的文档,目前已支持以下几种web框架,比java版的进展快多了
比较了这几种框架,准备采用Flask作为自己的框架,因为比较简单,灵活性大,学习成本低。而且在SAE都只是做一些个人学习研究性的项目,不需要太复杂的功能。
目前已在本地配置好环境,参考dev-server的安装说明
准备做一下个保存WIKI条目的列表(如百家姓等),通过JSON格式输出,由Android手机端调用显示,并跳转到具体的WIKI页面。
另外目前维基百科访问时,有时候链接会被重置,跟Google一样,这是个头疼的问题,SAE在国内,也不能作为代理访问,这个只能到时候再看了。
Android EditText强制输入数字
需要控制同时软输入法和实体输入法
//控制输入法只能用数字输入法 inputEdit.setInputType(InputType.TYPE_CLASS_PHONE); //设置文本框只接收数字输入,禁止实体键盘输入其他字符 DigitsKeyListener listener = new DigitsKeyListener(); inputEdit.setKeyListener(listener);
Android EditText 增加自定义过滤
在Android中,可以通过对EditText设置setFilters方法,用代码控制EditText的输入长度,或控制输入小数的位数等。
1.设置EditText的输入长度
inputEdit.setFilters(new InputFilter[] { new InputFilter.LengthFilter(
length) });
2.控制输入小数的位数
// 设置小数位数控制
InputFilter lengthfilter = new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
// 删除等特殊字符,直接返回
if ("".equals(source.toString())) {
return null;
}
String dValue = dest.toString();
String[] splitArray = dValue.split("\\.");
if (splitArray.length > 1) {
String dotValue = splitArray[1];
int diff = dotValue.length() + 1 - digLength;
if (diff > 0) {
return source.subSequence(start, end - diff);
}
}
return null;
}
};
inputEdit.setFilters(new InputFilter[] { lengthfilter });

