java中正则表达式中非捕获组的一些问题
请问1、(?:X)和(?>X)这两者分别表示什么,有什么关系?2、求一个正则表达式的写法,可以匹配比如说:开始和结尾分别是dog和cat,但是中间位置上不能有pig...
请问
1、(?:X)和(?>X)这两者分别表示什么,有什么关系?
2、求一个正则表达式的写法,可以匹配比如说:开始和结尾分别是dog和cat,但是中间位置上不能有pig 展开
1、(?:X)和(?>X)这两者分别表示什么,有什么关系?
2、求一个正则表达式的写法,可以匹配比如说:开始和结尾分别是dog和cat,但是中间位置上不能有pig 展开
1个回答
展开全部
(?:X)是非捕获组,也就是X不单独作为一个分组提取出来,不能用match.group(num) 这样的语法提取出来,num指数字1-9
(?>X)是原子分组,没用过,一般正则的规则是尽可能的匹配,比如 ([0-9]+)5 这个正则可以匹配“12345"这个字符串,因为[0-9]+虽可以匹配所有的数字,但为了匹配数字5必须回溯一位,[0-9]+匹配1234,如果正则是(?>[0-9]+)5则是不回溯的,不匹配。
2、求一个正则表达式的写法,可以匹配比如说:开始和结尾分别是dog和cat,但是中间位置上不能有pig
^dog((?!pig).)*cat$
(?>X)是原子分组,没用过,一般正则的规则是尽可能的匹配,比如 ([0-9]+)5 这个正则可以匹配“12345"这个字符串,因为[0-9]+虽可以匹配所有的数字,但为了匹配数字5必须回溯一位,[0-9]+匹配1234,如果正则是(?>[0-9]+)5则是不回溯的,不匹配。
2、求一个正则表达式的写法,可以匹配比如说:开始和结尾分别是dog和cat,但是中间位置上不能有pig
^dog((?!pig).)*cat$
追问
哥们儿,你的正则表达式学的太屌了,但是我这个^dog((?!pig).)*cat$并没有完全理解,你能和我详细讲讲么?
追答
这个正则的关键是中间的子正则((?!pig).)*,这个可以理解为0-n个"(?!pig)."重复,也就是((?!pig).(?!pig).(?!pig).(?!pig).(?!pig).……(?!pig).)这种形式,(?!pig)表示其后不能是pig,点匹配任意一个字符,这个子正则的开始跟的不能是pig,第一个字符后面不能是pig,第二个字符后不能是pig…………,依此类推。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询