在线等 Pattern p = Pattern.compile("abc(?!xy2)"); 正则表达式是什么意思啊,匹配什么格式的内容的啊?请解答一下

时间:2022-08-30 00:05:57
Pattern p = Pattern.compile("abc(?!xy2)"); 正则表达式是什么意思啊,匹配什么格式的内容的啊?请解答一下

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EEE {

public static String replace(String inputStr, String replaceStr) {
Pattern p = Pattern.compile("abc(?!xy2)");
Matcher m = p.matcher(inputStr);

return m.replaceAll(replaceStr);
}

public static void main(String[] args) {
System.out.println(EEE.replace("abcxabcyabcxyabcxy2", "ooo"));
;
}



为什么会输出oooxoooyoooxyabcxy2
谢谢

6 个解决方案

#1


(?!exp)表示正则表达式中的零宽断言
匹配后面跟的不是exp的位置
abc(?!xy2) 也就是匹配abcaakjdf,abc2xy2,。。
abc后面不是xy2的字符串

#2


abcxabcyabcxyabcxy2
这里只有最后abcxy2匹配,不替换,其他的遇到abc就替换
于是就有了oooxoooyoooxyabcxy2

#3


正则表达式
一、简介 

正则表达式这个名词,相信很多人都听说过,这个名词最早起源于1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。 

随后,发现可以将这一工作应用于使用Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson是Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的qed 编辑器。 

Q: 正则表达式,能够为我们做什么呢? 

A: 基于文本的编辑器和搜索工具中的一个重要部分。正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。 

下面我们就一步一步的结合它的语法,来介绍正则表达式的使用。 

二、初次接触正则表达式 

我们先来了解正则表达式的一些基本概念。正则表达式作为一种表示语言,其定义了自己的一套描述方式,来描述各种各样的字符类。下面摘取msdn中的一段定义。(ms-help: //MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconcharacterclasses.htm) 

字符转义表 
字符类 
含义 


与除 \n 以外的任何字符匹配。如果通过 Singleline 选项(请参阅正则表达式选项)进行了修改,则句点字符与任何字符匹配。 

[aeiou] 
与指定字符集中包含的任何单个字符匹配。 

[^aeiou] 
与不在指定字符集中的任何单个字符匹配。 

[0-9a-fA-F] 
使用连字号 (–) 允许指定连续字符范围。 

\p{name} 
与 name 指定的命名字符类中的任何字符匹配。支持的名称为 Unicode 组和块范围。例如 Ll£?Nd£?Z£?IsGreek£?IsBoxDrawing。 

\P{name} 
与在 {name} 中指定的组和块范围中未包含的文本匹配。 

\w 
与任何单词字符匹配。等效于 Unicode 字符类别 
[\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \w 等同于 [a-zA-Z_0-9]。 

\W 
与任何非单词字符匹配。等效于 Unicode 类别 [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \W 等同于 [^a-zA-Z_0-9]。 

\s 
与任何空白字符匹配。等效于 Unicode 字符类别 [\f\n\r\t\v\x85\p{Z}]。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \s 等同于 [ \f\n\r\t\v]。 

\S 
与任何非空白字符匹配。等效于 Unicode 字符类别 [^\f\n\r\t\v\x85\p{Z}]。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \S 等同于 [^ \f\n\r\t\v]。 

\d 
与任何十进制数字匹配。与 Unicode 的 \p{Nd} 和非 Unicode 的 [0-9] 以及 ECMAScript 行为一样。 

\D 
与任何非数字匹配。与 Unicode 的 \P{Nd} 和非 Unicode 的 [^0-9] 以及 ECMAScript 行为一样。 


上表列举了,正则表达式中最最基本的语法定义,了解这些,我们已经可以定义一些简单的规则了,例如: 

1. 匹配所有的字符 

当然是什么都不用写(@_@) 

2. 匹配所有的英文字符 

a) \w 

b) [a-zA-Z_0-9] 

3. 匹配十进制数字 

a) \d 

b) [0-9] 

看上面的例子,是不是觉得很简单呢,不过,到目前为止,这样写出来的规则,还有一个很大的缺陷,就是没有声明匹配字符的个数? 

Q: 我希望要匹配的字符为5个英文字母 

A: ??? 

光了解上面的知识是,无法解决这个的L。那正则表达式中是如何解决这个问题的呢,我们来看下面这个表: 

(ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconquantifiers.htm) 

限定符表 
限定符 
说明 


指定零个或更多个匹配;例如 \w* 或 (abc)*。与 {0,} 相同。 


指定一个或多个匹配;例如 \w+ 或 (abc)+。与 {1,} 相同。 


指定零个或一个匹配;例如 \w? 或 (abc)?。与 {0,1} 相同。 

{n} 
指定恰好 n 个匹配;例如 (pizza){2}。 

{n,} 
指定至少 n 个匹配;例如 (abc){2,}。 

{n,m} 
指定至少 n 个但不多于 m 个匹配。 

*? 
指定尽可能少地使用重复的第一个匹配 (lazy *)。 

+? 
指定尽可能少地使用重复但至少使用一次 (lazy +)。 

?? 
指定使用零次重复(如有可能)或一次重复 (lazy ?)。 

{n}? 
等效于 {n} (lazy {n})。 

{n,}? 
指定尽可能少地使用重复,但至少使用 n 次 (lazy {n,})。 

{n,m}? 
指定介于 n 次和 m 次之间、尽可能少地使用重复 (lazy {n,m})。 


上表中列出了,正则表达式的限定方式,配合这些字符的使用,我们就可以很方便的编写更为强劲的正则表达式了。 

例如: 

1. 匹配零个或多个所有的字符 



2. 匹配一个或多个所有字符 



3. 匹配零个或多个所有的英文字符 

\w* 

4. 匹配一个或多个所有的英文字符 

[a-zA-Z0-9]+ 

5. 匹配3个十进制数字 

\d{3} 

6. 匹配最少3个十进制数字 

\d{3,} 

7. 匹配3个到6个十进制数字 

\d{3,6} 

现在我们可以解答上面问题了: 

Q: 我希望要匹配的字符为5个英文字母 

A: \w{5} 

很高兴,我们已解决了上面的问题,不过,新的问题总是在不断的出现。我如何限制匹配字符出现在哪里呢? 

Q: 我希望匹配以doc开头的字符串 

A: ??? 

为了解决这个问题,我们先来看看这个表: 

(ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconatomiczero-widthassertions.htm) 

原子零宽度断言 
断言 
说明 


指定匹配必须出现在字符串的开头或行的开头。有关更多信息,请参阅正则表达式选项中的 Multiline 选项。 


指定匹配必须出现在以下位置:字符串结尾、字符串结尾的 \n 之前或行的结尾。有关更多信息,请参阅正则表达式选项中的 Multiline 选项。 

\A 
指定匹配必须出现在字符串的开头(忽略 Multiline 选项)。 

\Z 
指定匹配必须出现在字符串的结尾或字符串结尾的 \n 之前(忽略 Multiline 选项)。 

\z 
指定匹配必须出现在字符串的结尾(忽略 Multiline 选项)。 

\G 
指定匹配必须出现在当前搜索开始的位置(此位置通常是上一次搜索结束位置之后的第一个字符)。例如,请考虑一个由分离的字符组组成的串联字符串,其中每一组的长度都为 n 个字符。在每个字符组中搜索匹配时,如果正则表达式在 0、n、2n、3n 等字符位置找到匹配,则该正则表达式成功。仅当匹配出现在定位组边界上时才会成功。 

\b 
指定匹配必须出现在 \w(字母数字)和 \W(非字母数字)字符之间的边界上。匹配必须出现在单词边界上,即出现在由空格分隔的单词中第一个或最后一个字符上。 

\B 
指定匹配不得出现在 \b 边界上。 


相信大家都注意到了,在这个表中第一个断言字符就是我们需要的@_@. 

例如,^ 指定当前位置在行或字符串的开头。因此,正则表达式 ^FTP 只会返回那些在行的开头出现的字符串“FTP”的匹配项。 

看来上面碰到的问题,又可以解决了,让我们一起来解决上面的问题: 

Q: 我希望匹配以doc开头的字符串 

A: ^doc 

以上我们初步了解了什么是正则表达式,已经了解其最基本的语法,当作热身@_@,接下来,才正式进入主题,我们会从第二篇开始深入探讨正则表达式的使用。 
在前一篇文章中,介绍了一些初步的正则表达式的基本概念,相信很多人对正则表达式的基本知识有所了解,接下来,我们结合一些实际的编程示例来掩饰说明正则表达式的作用。 

首先,我们先看几个实际的例子: 

1. 验证输入字符是否全部为英文字符 

java script: 

var ex = "^\\w+$"; 

var re = new RegExp(ex,"i"); 

return re.test(str); 

vb script 

Dim regEx,flag,ex 

ex = "^\w+$" 

Set regEx = New RegExp 

regEx.IgnoreCase = True 

regEx.Global = True 

regEx.Pattern = ex 

flag = regEx.Test( str ) 

C# 

System.String ex = @"^\w+$"; 

System.Text.RegularExpressions.Regex reg = new Regex( ex ); bool flag = reg.IsMatch( str ); 

2. 验证邮件格式 

C# 

System.String ex = @"^\w+@\w+\.\w+$"; 

System.Text.RegularExpressions.Regex reg = new Regex( ex ); 

bool flag = reg.IsMatch( str ); 

3. 更改日期的格式(用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式) 

C# 

String MDYToDMY(String input) 



return Regex.Replace(input, 

"\\b(?<month>\\d{1,2})/(?<day>\\d{1,2})/(?<year>\\d{2,4})\\b", 

"${day}-${month}-${year}"); 



#4


那为什么是只替换不匹配里面的abc呢
还有Pattern p = Pattern.compile("abc(?!xy2)"); 
这里的(?!xy2)为什么要加括号啊,跟不加有什么区别啊?

#5


加括号说明那是一个整体否则正则表达式分析器,就不知道?!应该影响到哪里为止,以为是abc(?!x)y2

#6


http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#backreference
这是一个不错的正则表达式教程,一定有帮助
(?!exp)代表一个位置,而不是字符

#1


(?!exp)表示正则表达式中的零宽断言
匹配后面跟的不是exp的位置
abc(?!xy2) 也就是匹配abcaakjdf,abc2xy2,。。
abc后面不是xy2的字符串

#2


abcxabcyabcxyabcxy2
这里只有最后abcxy2匹配,不替换,其他的遇到abc就替换
于是就有了oooxoooyoooxyabcxy2

#3


正则表达式
一、简介 

正则表达式这个名词,相信很多人都听说过,这个名词最早起源于1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。 

随后,发现可以将这一工作应用于使用Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson是Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的qed 编辑器。 

Q: 正则表达式,能够为我们做什么呢? 

A: 基于文本的编辑器和搜索工具中的一个重要部分。正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。 

下面我们就一步一步的结合它的语法,来介绍正则表达式的使用。 

二、初次接触正则表达式 

我们先来了解正则表达式的一些基本概念。正则表达式作为一种表示语言,其定义了自己的一套描述方式,来描述各种各样的字符类。下面摘取msdn中的一段定义。(ms-help: //MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconcharacterclasses.htm) 

字符转义表 
字符类 
含义 


与除 \n 以外的任何字符匹配。如果通过 Singleline 选项(请参阅正则表达式选项)进行了修改,则句点字符与任何字符匹配。 

[aeiou] 
与指定字符集中包含的任何单个字符匹配。 

[^aeiou] 
与不在指定字符集中的任何单个字符匹配。 

[0-9a-fA-F] 
使用连字号 (–) 允许指定连续字符范围。 

\p{name} 
与 name 指定的命名字符类中的任何字符匹配。支持的名称为 Unicode 组和块范围。例如 Ll£?Nd£?Z£?IsGreek£?IsBoxDrawing。 

\P{name} 
与在 {name} 中指定的组和块范围中未包含的文本匹配。 

\w 
与任何单词字符匹配。等效于 Unicode 字符类别 
[\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \w 等同于 [a-zA-Z_0-9]。 

\W 
与任何非单词字符匹配。等效于 Unicode 类别 [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \W 等同于 [^a-zA-Z_0-9]。 

\s 
与任何空白字符匹配。等效于 Unicode 字符类别 [\f\n\r\t\v\x85\p{Z}]。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \s 等同于 [ \f\n\r\t\v]。 

\S 
与任何非空白字符匹配。等效于 Unicode 字符类别 [^\f\n\r\t\v\x85\p{Z}]。如果通过 ECMAScript 选项指定了符合 ECMAScript 的行为,则 \S 等同于 [^ \f\n\r\t\v]。 

\d 
与任何十进制数字匹配。与 Unicode 的 \p{Nd} 和非 Unicode 的 [0-9] 以及 ECMAScript 行为一样。 

\D 
与任何非数字匹配。与 Unicode 的 \P{Nd} 和非 Unicode 的 [^0-9] 以及 ECMAScript 行为一样。 


上表列举了,正则表达式中最最基本的语法定义,了解这些,我们已经可以定义一些简单的规则了,例如: 

1. 匹配所有的字符 

当然是什么都不用写(@_@) 

2. 匹配所有的英文字符 

a) \w 

b) [a-zA-Z_0-9] 

3. 匹配十进制数字 

a) \d 

b) [0-9] 

看上面的例子,是不是觉得很简单呢,不过,到目前为止,这样写出来的规则,还有一个很大的缺陷,就是没有声明匹配字符的个数? 

Q: 我希望要匹配的字符为5个英文字母 

A: ??? 

光了解上面的知识是,无法解决这个的L。那正则表达式中是如何解决这个问题的呢,我们来看下面这个表: 

(ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconquantifiers.htm) 

限定符表 
限定符 
说明 


指定零个或更多个匹配;例如 \w* 或 (abc)*。与 {0,} 相同。 


指定一个或多个匹配;例如 \w+ 或 (abc)+。与 {1,} 相同。 


指定零个或一个匹配;例如 \w? 或 (abc)?。与 {0,1} 相同。 

{n} 
指定恰好 n 个匹配;例如 (pizza){2}。 

{n,} 
指定至少 n 个匹配;例如 (abc){2,}。 

{n,m} 
指定至少 n 个但不多于 m 个匹配。 

*? 
指定尽可能少地使用重复的第一个匹配 (lazy *)。 

+? 
指定尽可能少地使用重复但至少使用一次 (lazy +)。 

?? 
指定使用零次重复(如有可能)或一次重复 (lazy ?)。 

{n}? 
等效于 {n} (lazy {n})。 

{n,}? 
指定尽可能少地使用重复,但至少使用 n 次 (lazy {n,})。 

{n,m}? 
指定介于 n 次和 m 次之间、尽可能少地使用重复 (lazy {n,m})。 


上表中列出了,正则表达式的限定方式,配合这些字符的使用,我们就可以很方便的编写更为强劲的正则表达式了。 

例如: 

1. 匹配零个或多个所有的字符 



2. 匹配一个或多个所有字符 



3. 匹配零个或多个所有的英文字符 

\w* 

4. 匹配一个或多个所有的英文字符 

[a-zA-Z0-9]+ 

5. 匹配3个十进制数字 

\d{3} 

6. 匹配最少3个十进制数字 

\d{3,} 

7. 匹配3个到6个十进制数字 

\d{3,6} 

现在我们可以解答上面问题了: 

Q: 我希望要匹配的字符为5个英文字母 

A: \w{5} 

很高兴,我们已解决了上面的问题,不过,新的问题总是在不断的出现。我如何限制匹配字符出现在哪里呢? 

Q: 我希望匹配以doc开头的字符串 

A: ??? 

为了解决这个问题,我们先来看看这个表: 

(ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconatomiczero-widthassertions.htm) 

原子零宽度断言 
断言 
说明 


指定匹配必须出现在字符串的开头或行的开头。有关更多信息,请参阅正则表达式选项中的 Multiline 选项。 


指定匹配必须出现在以下位置:字符串结尾、字符串结尾的 \n 之前或行的结尾。有关更多信息,请参阅正则表达式选项中的 Multiline 选项。 

\A 
指定匹配必须出现在字符串的开头(忽略 Multiline 选项)。 

\Z 
指定匹配必须出现在字符串的结尾或字符串结尾的 \n 之前(忽略 Multiline 选项)。 

\z 
指定匹配必须出现在字符串的结尾(忽略 Multiline 选项)。 

\G 
指定匹配必须出现在当前搜索开始的位置(此位置通常是上一次搜索结束位置之后的第一个字符)。例如,请考虑一个由分离的字符组组成的串联字符串,其中每一组的长度都为 n 个字符。在每个字符组中搜索匹配时,如果正则表达式在 0、n、2n、3n 等字符位置找到匹配,则该正则表达式成功。仅当匹配出现在定位组边界上时才会成功。 

\b 
指定匹配必须出现在 \w(字母数字)和 \W(非字母数字)字符之间的边界上。匹配必须出现在单词边界上,即出现在由空格分隔的单词中第一个或最后一个字符上。 

\B 
指定匹配不得出现在 \b 边界上。 


相信大家都注意到了,在这个表中第一个断言字符就是我们需要的@_@. 

例如,^ 指定当前位置在行或字符串的开头。因此,正则表达式 ^FTP 只会返回那些在行的开头出现的字符串“FTP”的匹配项。 

看来上面碰到的问题,又可以解决了,让我们一起来解决上面的问题: 

Q: 我希望匹配以doc开头的字符串 

A: ^doc 

以上我们初步了解了什么是正则表达式,已经了解其最基本的语法,当作热身@_@,接下来,才正式进入主题,我们会从第二篇开始深入探讨正则表达式的使用。 
在前一篇文章中,介绍了一些初步的正则表达式的基本概念,相信很多人对正则表达式的基本知识有所了解,接下来,我们结合一些实际的编程示例来掩饰说明正则表达式的作用。 

首先,我们先看几个实际的例子: 

1. 验证输入字符是否全部为英文字符 

java script: 

var ex = "^\\w+$"; 

var re = new RegExp(ex,"i"); 

return re.test(str); 

vb script 

Dim regEx,flag,ex 

ex = "^\w+$" 

Set regEx = New RegExp 

regEx.IgnoreCase = True 

regEx.Global = True 

regEx.Pattern = ex 

flag = regEx.Test( str ) 

C# 

System.String ex = @"^\w+$"; 

System.Text.RegularExpressions.Regex reg = new Regex( ex ); bool flag = reg.IsMatch( str ); 

2. 验证邮件格式 

C# 

System.String ex = @"^\w+@\w+\.\w+$"; 

System.Text.RegularExpressions.Regex reg = new Regex( ex ); 

bool flag = reg.IsMatch( str ); 

3. 更改日期的格式(用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式) 

C# 

String MDYToDMY(String input) 



return Regex.Replace(input, 

"\\b(?<month>\\d{1,2})/(?<day>\\d{1,2})/(?<year>\\d{2,4})\\b", 

"${day}-${month}-${year}"); 



#4


那为什么是只替换不匹配里面的abc呢
还有Pattern p = Pattern.compile("abc(?!xy2)"); 
这里的(?!xy2)为什么要加括号啊,跟不加有什么区别啊?

#5


加括号说明那是一个整体否则正则表达式分析器,就不知道?!应该影响到哪里为止,以为是abc(?!x)y2

#6


http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#backreference
这是一个不错的正则表达式教程,一定有帮助
(?!exp)代表一个位置,而不是字符