正则表达式-如何匹配一对符号内的内容
2017-05-19 16:54
519 查看
摘要:以引号""为例来介绍如何使用正则匹配。
import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
String regEx = "\"(.+)\"";
String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(source);
while (matcher.find()) {
String result = matcher.group(0);
System.out.println(result);
}
}
}
返回结果:
"McDon ald's" is said "markudonarudo"
import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
String regEx = "\"([^\"]+)\"";
String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(source);
while (matcher.find()) {
String result = matcher.group(0);
System.out.println(result);
}
}
}
返回结果:
"McDon ald's" "markudonarudo"
其实我想要的结果是第二种,区别是第二种我是用的是排除型字符组[^],而第一种使用的是.+。那么我们接着使用.+ 来分析。
因为.可以匹配任意字符,[^\"] 只能匹配非引号(")之外的任意字符,加上正则的贪婪性,就一直往后匹配到结尾, 又由于结束符是一个引号("),所以匹配的结尾是不满足条件的,再往前一个字符一个字符的移动,直到匹配到引号("),所以就得到了例一的结果。
那么如何让它不贪婪而达到例二的效果呢,请看例三。
import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
String regEx = "\"(.+?)\"";
String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(source);
while (matcher.find()) {
String result = matcher.group(0);
System.out.println(result);
}
}
}
返回结果:
现在看起来例三和例二的结果一样了。这次使用了懒惰模式,使用了?,就把贪婪模式变为懒惰模式,顾名思义,就是能接受就结束,可以把贪婪模式理解为从第一个匹配位置开始的逆向匹配,而懒惰模式可以理解为从第一个匹配位置开始的正向匹配,就是找到能匹配到的末尾引号(")就结束。
情景故事:
.+?的意思是在匹配的前提下,尽可能少的匹配,怎么样理解尽可能少,如此例中,.+?本来可以像上一个例子中,匹配一大串,但是由于后面有个?总是催促:“你匹配好了没有,该我了吧?”,所以,.+心理很烦,变得很懒了,在第一“收尾的时候就停下来了,这样就得到了正确的结果。
import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
String regEx = "(?<=\")(.+?)(?=\")";
String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(source);
while (matcher.find()) {
String result = matcher.group(0);
System.out.println(result);
}
}
}
返回结果:
McDon ald's
is said
markudonarudo
这种情况就是出现了环视,两个一号之间的都匹配出来了,这次来分析一下这个正则表达式。
1. ?单独使用就成了最好匹配一次,即使不匹配也可以的元字符,所以懒惰的用法应该是紧跟着贪婪元字符的后面
2. (?<=")代表这个位置的左边必须有一个" ,既然正则不会占用"
,它只需要左边是 " 右边是什么它不会管,这样我们可以认为它占用了一个什么都不是的缝隙位置,这个缝隙位置只有一个要求就是左边是
"。
3. (?=\")的意思是占用两个字符之间的缝隙位置,缝隙位置的右边是"。
由于环视都不会占用字符,而缝隙只是理解,并不存在真正的缝隙,这样匹配结束后的位置只是到达s 和 "之间的位置,下一次匹配的时候就会把 "
也匹配上。
import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
String regEx = "\"((?!\").)+\"";
String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(source);
while (matcher.find()) {
String result = matcher.group(0);
System.out.println(result);
}
}
}
运行结果:
"McDon ald's" "markudonarudo"
例四是环视,例五就排除环视。
1. (?!\").的意思是一个位置的右边不能是" ,然后后面接了一个. ,就是说.表示的其他字符都行,就是不能是"。
原文链接:正则表达式---获取英文双引号里面的内容
例一:
import java.util.regex.Matcher;import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
String regEx = "\"(.+)\"";
String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(source);
while (matcher.find()) {
String result = matcher.group(0);
System.out.println(result);
}
}
}
返回结果:
"McDon ald's" is said "markudonarudo"
例二:
import java.util.regex.Matcher;import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
String regEx = "\"([^\"]+)\"";
String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(source);
while (matcher.find()) {
String result = matcher.group(0);
System.out.println(result);
}
}
}
返回结果:
"McDon ald's" "markudonarudo"
其实我想要的结果是第二种,区别是第二种我是用的是排除型字符组[^],而第一种使用的是.+。那么我们接着使用.+ 来分析。
因为.可以匹配任意字符,[^\"] 只能匹配非引号(")之外的任意字符,加上正则的贪婪性,就一直往后匹配到结尾, 又由于结束符是一个引号("),所以匹配的结尾是不满足条件的,再往前一个字符一个字符的移动,直到匹配到引号("),所以就得到了例一的结果。
那么如何让它不贪婪而达到例二的效果呢,请看例三。
例三:
import java.util.regex.Matcher;import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
String regEx = "\"(.+?)\"";
String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(source);
while (matcher.find()) {
String result = matcher.group(0);
System.out.println(result);
}
}
}
返回结果:
"McDon ald's" "markudonarudo"
现在看起来例三和例二的结果一样了。这次使用了懒惰模式,使用了?,就把贪婪模式变为懒惰模式,顾名思义,就是能接受就结束,可以把贪婪模式理解为从第一个匹配位置开始的逆向匹配,而懒惰模式可以理解为从第一个匹配位置开始的正向匹配,就是找到能匹配到的末尾引号(")就结束。
情景故事:
.+?的意思是在匹配的前提下,尽可能少的匹配,怎么样理解尽可能少,如此例中,.+?本来可以像上一个例子中,匹配一大串,但是由于后面有个?总是催促:“你匹配好了没有,该我了吧?”,所以,.+心理很烦,变得很懒了,在第一“收尾的时候就停下来了,这样就得到了正确的结果。
例四:
import java.util.regex.Matcher;import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
String regEx = "(?<=\")(.+?)(?=\")";
String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(source);
while (matcher.find()) {
String result = matcher.group(0);
System.out.println(result);
}
}
}
返回结果:
McDon ald's
is said
markudonarudo
这种情况就是出现了环视,两个一号之间的都匹配出来了,这次来分析一下这个正则表达式。
1. ?单独使用就成了最好匹配一次,即使不匹配也可以的元字符,所以懒惰的用法应该是紧跟着贪婪元字符的后面
2. (?<=")代表这个位置的左边必须有一个" ,既然正则不会占用"
,它只需要左边是 " 右边是什么它不会管,这样我们可以认为它占用了一个什么都不是的缝隙位置,这个缝隙位置只有一个要求就是左边是
"。
3. (?=\")的意思是占用两个字符之间的缝隙位置,缝隙位置的右边是"。
由于环视都不会占用字符,而缝隙只是理解,并不存在真正的缝隙,这样匹配结束后的位置只是到达s 和 "之间的位置,下一次匹配的时候就会把 "
也匹配上。
例五:
import java.util.regex.Matcher;import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
String regEx = "\"((?!\").)+\"";
String source = "The name \"McDon ald's\" is said \"markudonarudo\" in Japanese";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(source);
while (matcher.find()) {
String result = matcher.group(0);
System.out.println(result);
}
}
}
运行结果:
"McDon ald's" "markudonarudo"
例四是环视,例五就排除环视。
1. (?!\").的意思是一个位置的右边不能是" ,然后后面接了一个. ,就是说.表示的其他字符都行,就是不能是"。
原文链接:正则表达式---获取英文双引号里面的内容
相关文章推荐
- 如何利用正则表达式匹配花括号内的内容
- 如何ASP代码中编写正则表达式来获取其中双引号间内容
- php中utf-8编码下用正则表达式如何匹配汉字
- php中utf-8编码下用正则表达式如何匹配汉字
- 如何用正则表达式替换掉所有HTM内容
- php编程如何中指定区别内容的正则表达式书写
- 正则表达式的贪婪模式和非贪婪模式,如何取div ,li 标签的循环内容,采集别人网站的内容
- 正则表达式之位置指定(匹配表达式之前或者之后)附匹配以某内容开始,某内容结束的通用正则
- qt 中使用正则表达式去除匹配到的内容
- 正则表达式要匹配双引号"如何才能匹配
- 如何匹配嵌套Html标签(正则表达式)
- php中utf-8、gbk编码下用正则表达式如何匹配汉字[转]
- 正则表达式 匹配换行 的内容
- 通过正则表达式获取匹配内容
- 如何用正则表达式匹配HTML中的动态数据?
- 如何用正则表达式匹配出变量
- 正则表达式:如何匹配反斜杠 "/"
- php中utf-8编码下用正则表达式如何匹配汉字
- 正则表达式如何匹配换行符
- 如何用grep的正则表达式匹配搜索回文单词