`
kanpiaoxue
  • 浏览: 1745668 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

tmp

 
阅读更多

最好养成按照字符来理解正则表达式的习惯

不要这样:

^cat   匹配以cat开头的行

而应该这样理解:

^cat 匹配以c作为一行的第一个字符,紧接着一个a,紧接着一个t的文本

 

 

在字符组[]内部,连字符 - 才是元字符,才表示一个范围。如:[0-9], [a-z],在字符组[]外面的连字符 - 只能匹配连字符,而不是范围。在字符组[]内部,如果连字符-在开头,就是普通的连字符。如:[-1] , 03[-./]19[-./]76   这里的连字符 - 紧接着[ 或者 [^ 出现,形成 [- 或者 [^-  。如果采用 [.-/] 就是错误的用法。

字符组[]的多重范围也是允许的: [0-9a-zA-Z]

在字符组[]里面,问号?,点号 . 都不是元字符。在字符组[]里面和外面,元字符的定义和意义是不一样的。

03[-./]19[-./]76 匹配:03-19-76, 03.19.76, 03/19/76

 

^在字符组[]内部就是一个元字符,在字符组[]外面,就是一个锚点

q[^u] 排除行字符组[]表示“匹配一个未列出的字符”,而不是“不要匹配列出的字符”。一种简单的理解就是除了“排除型字符组中所有字符”以外的字符

 

用点号匹配任意字符

 

一个很重要的问题,写正则表达式时,需要在对欲检索的文本的了解程度与检索精确性之间求得平衡。

 

我们来匹配 gr[ea]y,还可以写作 grey|gray ,或是 gr(e|a)y

注意 gr[e|a]y 不是我们想要的,因为元字符字符组[]里面和外面的定义和意义都不一样。

 

或 | 字符构成“多选结构”

 

一个字符组[]只能匹配单个字符,而多选结构自身可能是完整的正则表达式,可以匹配任意长度的文本。

 

量词:?, +, *

? 零次或一次 (可以不出现,也可以只出现一次:单次选择)

+ 一次或多次(可以出现无数次,但至少要出现一次:至少一次)

* 任意次(零次,大于零次)(可以出现无数次,也可以不出现:任意次数均可)

区间:{min,max} 

 

 

括号()的分组顺序是按照开括号 '(' 从左至右的出现顺序进行的。

(.+) \1 matches 'the the' or '55 55'

 

变量名: 标识符只包含字母、数字以及下划线,但不能以数字开头。[a-zA-Z_][a-zA-Z0-9]*

 

引号内的字符串:"[^"]*"

 

() 分组,捕获。

(?:)分区,不捕获。

 

 

股票价格9.05000000037272 ,这里显然应该是 9.05 ,但是因为计算机内部表示浮点的原理,有时会以没什么用的格式输出这样的结果 9.5000000037272 。

要求归结为:通常是保留小数点后面两位数字,如果第三位不为零,也需要保留,去掉其他的数字。结果就是 12.375000000392或者12.375会被修正为 12.375,而 37.500会被修正为 37.50

正则表达式:  (\.\d\d[1-9]?)\d*

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String str = "9.50000000037272";
		String str1 = "11.07100000037272";
		System.out.println(testFormatDecimal(str));		// output : 9.50
		System.out.println(testFormatDecimal(str1));		// output : 11.071
	}

	private static String testFormatDecimal(String numberString) {
		String regex = "(\\.\\d\\d[1-9]?)\\d*";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(numberString);
		if (matcher.find()) {
			return matcher.replaceAll(matcher.group(1));
		}
		return null;
	}

}

 

 

 

 正则表达式之分组语法

捕获

(exp)匹配exp,并捕获文本到自动命名的组里

(?<name>exp)匹配exp,并捕获文本到名称为name的组里

(?:exp)匹配exp,不捕获匹配的文本

位置指定

(?=exp)匹配exp前面的位置

(?<=exp)匹配exp后面的位置

(?!exp)匹配后面跟的不是exp的位置

(?<!exp)匹配前面不是exp的位置

注释

(?#comment)这种类型的组不对正则表达式的处理产生任何影响,只是为了提供让人阅读注释

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics