首页 > 试题广场 >

Java中用正则表达式截取字符串中第一个出现的英文左括号之前

[单选题]
Java中用正则表达式截取字符串中第一个出现的英文左括号之前的字符串。比如:北京市(海淀区)(朝阳区)(西城区),截取结果为:北京市。正则表达式为()
  • ".*?(?=\\()"
  • ".*?(?=\()"
  • ".*(?=\\()"
  • ".*(?=\()"
推荐
答案是A
        String str = "北京市(海淀区)(朝阳区)(西城区)";

        String patStr = ".*?(?=\\()";
        
        Pattern pattern = Pattern.compile(patStr);
        
        Matcher matcher = pattern.matcher(str);
        
        if(matcher.find())
        {
            System.out.println(matcher.group(0));
        }
        else
        {
            System.out.println(matcher.group(0));
        }
编辑于 2015-06-23 14:59:23 回复(17)
http://www.cnblogs.com/xudong-bupt/p/3586889.html
1.什么是正则表达式的贪婪与非贪婪匹配

如:String str="abcaxc";

Patter p="ab*c";

贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c)。

非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c)。

2.编程中如何区分两种模式

默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。

量词:{m,n}:m到n个

*:任意多个

+:一个到多个

?:0或一个
以上来自博主的博客,然后这道题目
.表示除\n之外的任意字符
*表示匹配0-无穷
+表示匹配1-无穷
(?=Expression) 顺序环视,(?=\\()就是匹配正括号
懒惰模式正则:
src=".*? (?=\\()) "
结果:北京市
因为匹配到第一个"就结束了一次匹配。不会继续向后匹配。因为他懒惰嘛。
发表于 2016-01-24 21:13:55 回复(19)
A ".*?(?=\\()"
B ".*?(?=\()"
C ".*(?=\\()"
D ".*(?=\()"

前面的.*?是非贪婪匹配的意思, 表示找到最小的就可以了
(?=Expression) 顺序环视,(?=\\()就是匹配正括号

String text = "北京市(海淀区)(朝阳区)(西城区)";
Pattern pattern = Pattern.compile(".*?(?=\\()" );
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println(matcher.group(0));
}
编辑于 2015-06-01 20:51:40 回复(3)
选A, 知识点是正则表达式中的贪婪匹配。
1、正则表达式中元字符:
".":匹配除去\n换行符的任意字符
"*":匹配前面子表达式任意次
"?":匹配前面子表达式的0次或1次,如果前面也是元字符,那么它就是非贪婪匹配了(默认是贪婪匹配的)。
2、B中 ".*?(?=\\()"中后面的(?=\\()它是(?=assert)的形式,叫做顺序环视,也就是前面.*?匹配到的字符后面必须要紧接着有assrt中声明的值,也就是左括号(其中\\都是转义字符),但是匹配的到的串是不包含assrt中声明的内容的。
3、题中,原串 “北京市(海淀区)(朝阳区)(西城区)”,首先匹配到北京市(前部分),然后北京市后面有左括号( ,这是后面顺序环视部分,但是不包括左括号,这样整个串就匹配完了,截取到的串为“北京市”。
发表于 2016-10-17 10:54:03 回复(8)
String patStr = ".*?(?=\\()";   
'.' 是一个元字符,匹配 除了换行符以外的任意字符.
'*' 同样是元字符,不过它代表的不是字符,也不是位置,而是数量——它指定* 前边的内容可以连续重复使用任意次以使整个表达式得到匹配.' .*' 连在一起就意味着 任意数量的不包含换行的字符.
(?=exp) 也叫 零宽度正预测先行断言 ,它 断言自身出现的位置的后面能匹配表达式exp 。比如 \b\w+(?=ing\b) ,匹配 以ing结尾的单词的前面部分(除了ing以外的部分) ,如查找 I'm singing while you're dancing. 时,它会匹配 sing danc
此题中的\\ 为转义









发表于 2016-03-12 19:55:10 回复(1)
答案:C
首先正则表达式在java中写为字符串,正则表达式中的‘\’在java字符串中要写为‘\\’
如果直接在java中写‘\(’会编译出错,提示无效转义字符
其次 *? 在正则中代表非贪婪匹配模式,会尽量少的匹配字符,如果不加 ?就是贪婪模式,此时通配符会把所有字符都匹配掉,后面的就无效了

编辑于 2015-01-17 16:43:02 回复(2)
java正则表达式中的 ‘\’ 在java字符串中要写为 ‘\\’ 
发表于 2016-08-24 14:55:36 回复(0)
(?=pattern) ,根据我的理解(有问题请指出),这个正则 pattern部分代表条件,匹配符合这个条件的字符串,但是结果中不包含这个条件。'Windows (?=95|98|NT|2000)' 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。换言说,这是一个非捕获匹配,意思是pattern匹配了,但是它不会被捕获,供以后使用。
.*?(?=\\() 这个 .代表匹配除"\r\n"之外的任何单个字符 , * 量词,表示0次到多次,紧跟在量词( {m,n} ,+,?,*)后面的?表示非贪婪匹配,即匹配到就可,不会更多的匹配,\(  表示匹配 ( ,加 \\(  第一个\是转义,
(?=\\()即表示匹配条件是 ( ,但是结果不包含 ( 


发表于 2017-05-07 10:06:24 回复(0)

这题真是绝了,像我这种经常做做爬虫的人才有可能掌握的知识,你叫新手去背实在是太过分了

发表于 2019-06-29 13:15:25 回复(1)
http://www.cnblogs.com/xudong-bupt/p/3586889.html
发表于 2016-11-04 11:22:14 回复(0)
选b,两边的*其实应该是引号;
.*加上?是0或多个任意字符的非贪婪匹配;
(?=。。。)表示positive lookahead;
\(表示左括弧的转义
编辑于 2015-06-23 14:59:23 回复(2)
.*:表示贪婪模式
.*?:表示非贪婪模式
发表于 2018-07-22 11:57:34 回复(0)
".":匹配除了\n之外的任意字符
"*?":是懒惰限定符,重复任意次,但尽可能少重复
"(?=exp)":匹配exp前面的位置
exp=//(:左括号
发表于 2017-07-18 18:44:56 回复(0)
.*?(?=assert)中的(?=assert)表示顺序环视,即.*?匹配到的字符后面必须紧挨着assert的字符(但不包含assert)。A选项里的assert即左括号(,又是在非贪婪模式下,所以匹配到的是最短的北京市。
编辑于 2016-09-01 13:12:51 回复(0)
发表于 2015-09-26 16:08:45 回复(4)
b
发表于 2015-06-03 18:35:13 回复(0)
呢 ↗.都系$\→_→
发表于 2019-09-26 08:37:19 回复(0)
String text = "北京市(海淀区)(朝阳区)(西城区)";
Pattern pattern = Pattern.compile(".*?区" );
//北           '.' 是一个元字符,匹配 除了换行符以外的任意字符.
Pattern pattern1 = Pattern.compile(".*" );
//北京市(海淀区)(朝阳区)(西城区)         '*' 匹配前面子表达式任意次
Pattern pattern2 = Pattern.compile(".*?区" );
//北京市(海淀区         查找区字前面的 一次
Pattern pattern3 = Pattern.compile(".*?(?=\\()" );
//北京市
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println(matcher.group(0));

}

编辑于 2019-08-11 07:35:26 回复(0)
前置知识:
1. exp1(?=exp2) 属于零宽度正预测先行断言,表示匹配并捕获 exp1,同时 exp1 后面必须紧跟 exp2 模式,同时,exp2 的内容不被捕获,即最终捕获的值只有 exp1,没有 exp2
2. 懒惰匹配。默认贪婪匹配,即在可能的情况下尽可能多的匹配字符。懒惰匹配是一旦匹配成功,则马上停止。

.* 用来匹配除换行符外的所有字符,是贪婪匹配。如字符串 "ababab",用 /(ab).*/ 默认得到 "abab"。懒惰匹配为 /(ab).*?/,匹配值为 "ab"

回到题目,选项我觉得都有问题。
如果是 .*?(?=\() ,对应 exp1(?=exp2),其中 exp1: .*?,exp2: \(。前者表示用懒惰匹配任意字符,后者表示 exp1 匹配出的字符后面应该跟着一个左括号(\c)。但实际上除了 "北京市",(海淀区) 也符合匹配规则

因此最好再加上 ^ ,即 ^.*?(?=\()) 这样可以将 "(海淀区)" 等过滤

编辑于 2019-07-17 18:44:34 回复(0)
发表于 2019-03-22 10:30:35 回复(0)
正则表达式
发表于 2019-03-09 22:36:46 回复(0)