首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

问个正则的有关问题

2012-06-21 
问个正则的问题刚才在一个帖子中看到(?X)这样的正则表达式,jdk文档中说这是X,通过零宽度的正 lookahead,

问个正则的问题
刚才在一个帖子中看到(?=X)这样的正则表达式,jdk文档中说这是X,通过零宽度的正 lookahead,我表示不是很明白,希望有高手能讲解一下,最好举个例子说明一下,谢谢了

[解决办法]
搜索 肯定顺序环视
[解决办法]

探讨

搜索 肯定顺序环视

[解决办法]
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * 正则表达式非捕获组
 * 特殊构造(非捕获) (JDK API说明)
 * 1.(?:X) X,作为非捕获组 
 * 2.(?idmsux-idmsux) Nothing,但是将匹配标志i d m s u x on - off 
 * 3.(?idmsux-idmsux:X) X,作为带有给定标志 i d m s u x on - off
 * 4.(?=X) X,通过零宽度的正 lookahead 
 * 5.(?!X) X,通过零宽度的负 lookahead 
 * 6.(?<=X) X,通过零宽度的正 lookbehind 
 * 7.(?<!X) X,通过零宽度的负 lookbehind 
 * 8.(?>X) X,作为独立的非捕获组 
 *
 */
public class NonCapturingGroups {

public static void main(String args[]) {
//1.(?:)不记录组号
NonCapturingGroups.testRegExp("(\\d+)(\\.?)(\\d+)([¥$])$", "123.43$", new int[]{1,4});
NonCapturingGroups.testRegExp("(\\d+)(?:\\.?)(?:\\d+)([¥$])$", "123.43$", new int[]{1,2});

//2.3 用于标志匹配,比如:(?i) 打开不区分大小写开关;(?-i) 关闭标志,恢复不区分大小写
//正则可改写成:(?i:abc)def 或者 (?i)abc(?-i:def)
//没有(?-1)时,没有关闭,可匹配AbcDef
//NonCapturingGroups.testRegExp("(?i)abc(?-i)def", "Abcdef");

//4.5 !为=取反
//(?=) 在前面,输出ba, 4--6. 表示以b开头,结果集中包含b
//试试(?=b)a, 永远无输出
//NonCapturingGroups.testRegExp(".{2}(?=b)", "aacabaaqq");
//(?=) 在后面,输出ac, 2--4. 表示以2字符后面紧跟b,不捕获b
//NonCapturingGroups.testRegExp(".{2}(?=b)", "aacabaaqq");
//NonCapturingGroups.testRegExp(".{2}(?=b).{2}", "aacabaaqq");

//6.7 
//lookahead: 前面紧跟 ; lookbehind: 后面紧跟
//NonCapturingGroups.testRegExp(".{2}(?=b)", "aacabaaqq");
//NonCapturingGroups.testRegExp(".{2}(?<=b)", "aacabaaqq");
//NonCapturingGroups.testRegExp(".{2}(?=b).{2}", "aacabaaqq"); //获取b前紧跟2字符
//NonCapturingGroups.testRegExp(".{2}(?<=b).{2}", "aacabaaqq"); // 获取b后紧跟2字符

//8.(?>) 匹配失败,跳过
//NonCapturingGroups.testRegExp("a(bc|b)c", "abc");
//NonCapturingGroups.testRegExp("a(?>bc|b)c", "abc");
}

/**
* @param regExp: 正则表达式
* @param resource: 源字符串
*/
public static void testRegExp(String regExp, String resource) {
Pattern p = Pattern.compile(regExp);
Matcher m = p.matcher(resource);
int count = 0;
while(m.find()) {
count ++;
System.out.println(m.group());
System.out.println(m.start() + "---" + m.end());
}
if(count == 0)
System.out.println("not find");
}

/**
* @param regExp: 正则表达式
* @param resource: 源字符串
* @param groups: 输出组号
*/
public static void testRegExp(String regExp, String resource, int[] groups) {
Pattern p = Pattern.compile(regExp);
Matcher m = p.matcher(resource);
while(m.find()) {
if(null == groups)
groups = new int[]{0};
for(int i=0; i<groups.length; i++) {
System.out.print(m.group(groups[i]));
}
System.out.println();
}

}

热点排行