`
hain
  • 浏览: 454066 次
  • 来自: ...
社区版块
存档分类
最新评论

正则表达式

阅读更多
java.util.regex.Pattern

正则表达式的一种已编译的实现。

正则表达式通常以字符串的形式出现,它首先必须被编译为Pattern类的一个实例。
结果模型可以用来生成一个Matcher,它(生成的Macher实例)可以匹配根据
这个正则表达式生成的任意字符序列。在实现一个匹配器中的匹配时包括了
任意多的情况,并且多个匹配器可以共享同一个匹配模式。
下面是一个典型的调用次序:

Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();

为了方便使用,Pattern类也定义了matches()方法,
因为有时候一个正则表达使只用到一次。
在一次调用中,这个方法首先编译表达式,然后匹配输入的序列。
下面这个句子:

boolean b = Pattern.matches("a*b", "aaaaab");

等价于上面的三个句子。但是由于它不允许便以后的模式被重用,所以在需要重复匹配
时显然比上面的方法效率要低。

Pattern类的实例不能被改变,并且是线程安全的。注意,Matcher类并不是线程安全的


正则表达式结构简介:
字符:
x   字符 x
\\  反斜杠
\0n     十进制数 (0 <= n <= 7)
\0nn    十进制数 0nn (0 <= n <= 7)
\0mnn   十进制数 0mnn (0 <= m <= 3, 0 <= n <= 7)
\xhh    十六进制数 0xhh
\uhhhh  十六进制数 0xhhhh
\t  制表符 ('\u0009')
\n  换行符 ('\u000A')
\r  回车符 ('\u000D')
\f  The form-feed character ('\u000C')
\a  The alert (bell) character ('\u0007')
\e  esc符号 ('\u001B')
\cx     x 对应的控制符

字符类
[abc]       a, b, 或 c (简单字符串)
[^abc]      除了 a, b, 或 c 之外的任意字符(否定)
[a-zA-Z]    从a 到 z 或 从A 到 Z(包括a,z,A,Z)(范围)
[a-d[m-p]]  从a 到 d, 或 从m 到 p: [a-dm-p] (并集)
[a-z&&[def]]    d, e, 或 f (交集)
[a-z&&[^bc]]    从a 到 z, 但 b 和 c 除外: [ad-z] (子集)
[a-z&&[^m-p]]   从a 到 z, 不包括从 m 到 p: [a-lq-z](子集)

预定义字符序列
.   任意字符 (也可能不包括行结束符)
\d  数字: [0-9]
\D  非数字: [^0-9]
\s  空字符: [ \t\n\x0B\f\r]
\S  非空字符: [^\s]
\w  单字字符: [a-zA-Z_0-9]
\W  非单字字符: [^\w]

POSIX 字符类 (US-ASCII only)
\p{Lower}   小写字母字符: [a-z]
\p{Upper}   大写字母字符:[A-Z]
\p{ASCII}   所有 ASCII:[\x00-\x7F]
\p{Alpha}   单个字母字符:[\p{Lower}\p{Upper}]
\p{Digit}   十进制数: [0-9]
\p{Alnum}   单个字符:[\p{Alpha}\p{Digit}]
\p{Punct}   标点符号: 包括 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph}   可视字符: [\p{Alnum}\p{Punct}]
\p{Print}   可打印字符: [\p{Graph}]
\p{Blank}   空格或制表符: [ \t]
\p{Cntrl}   控制字符: [\x00-\x1F\x7F]
\p{XDigit}  十六进制数: [0-9a-fA-F]
\p{Space}   空字符: [ \t\n\x0B\f\r]

Unicode 字符类
\p{InGreek}     希腊语种的字符 (simple block)
\p{Lu}      大写字母 (simple category)
\p{Sc}      货币符号
\P{InGreek}     除希腊语种字符外的任意字符 (negation)
[\p{L}&&[^\p{Lu}]]  除大写字母外的任意字符 (subtraction)

边界匹配器
^   一行的开始
$   一行的结束
\b  单词边界
\B  非单词边界
\A  输入的开始
\G  当前匹配的结束
\Z  The end of the input but for the final terminator, if any
\z  输入的结束

Greedy quantifiers
贪婪匹配量词(Greedy quantifiers )(不知道翻译的对不对)
X?          X不出现或出现一次
X*          X不出现或出现多次
X+          X至少出现一次
X{n}        X出现n次
X{n,}       X至少出现n次
X{n,m}      X至少出现n次,但不会超过m次

Reluctant quantifiers
X??         X, 不出现或出现一次
X*?         X, 不出现或出现多次
X+?         X, 至少出现一次
X{n}?       X, 出现n次
X{n,}?      X, 至少出现n次
X{n,m}?     X, 至少出现n次,但不会超过m次

Possessive quantifiers
X?+     X, 不出现或出现一次
X*+         X, 不出现或出现多次
X++         X, 至少出现一次
X{n}+       X, 出现n次
X{n,}+      X, 至少出现n次
X{n,m}+     X, 至少出现n次,但不会超过m次

逻辑运算符
XY  Y跟在X后面
X|Y     X 或 Y
(X)     X, as a capturing group

反向引用
\n  Whatever the nth capturing group matched

Quotation
\   引用后面的字符
\Q  引用所有的字符直到 \E 出现
\E  结束以 \Q 开始的引用

Special constructs (non-capturing)
(?:X)           X, as a non-capturing group
(?idmsux-idmsux)    匹配标志开关
(?idmsux-idmsux:X)      X, as a non-capturing group with the given flags on
- off
(?=X)           X, via zero-width positive lookahead
(?!X)           X, via zero-width negative lookahead
(?<=X)          X, via zero-width positive lookbehind
(?<!X)          X, via zero-width negative lookbehind
(?>X)           X, as an independent, non-capturing group

Backslashes, escapes, and quoting

反斜杠字符('\')用来转义,就像上面的表中定义的那样,如果不这样做的话可能会产生
歧义。因此,表达式\\匹配
单个反斜杠,表达式\{匹配单个左花括号。
如果把反斜杠放在没有定义转移构造的任何字母符号前面都会发生错误,这些将被保留
到以后的正则表达式中扩展。反斜杠可以放在任何
非字母符号前面,即使它没有定义转义构造也不会发生错误。
在java语言规范中指出,在java代码中自符串中的反斜杠是必要的,不管用于Unicode转
义,还是用于普通的字符转义。因此,
为了保持正则表达式的完整性,在java字符串中要写两个反斜杠。例如,在正则表达式
中字符'\b'代表退格,'\\b'则代表单词边界。'\(hello\)'是无效的,并且会产生编译
时错误,你必须用
'\\(hello\\)'来匹配(hello)。

Character Classes

字符类可以出现在其他字符类内部,并且可以由并操作符和与操作符(&&)组成。并集操
作结果是,其中的任意字符,肯定在至少其中操作数中至少出现过一次。
交集的结果包括各个操作数中同时出现的任意字符。

字符类操作符的优先级如下:(从高到低)
1     文字转义      \x
2     集合      [...]
3     范围      a-z
4     并集      [a-e][i-u]
5     交集      [a-z&&[aeiou]]

请注意各个字符类的有效字符集。例如,在字符类中,正则表达式.失去了它的特别含义
,而-变成了元字符的范围指示。

Line terminators

行结束符是一个或两个字符序列,用来标识输入字符序列的一行的结束。下列都被认为
是行结束符:

换行符      ('\n'),
回车换行符  ("\r\n"),
回车符      ('\r'),
下一行      ('\u0085'),
行分隔符    ('\u2028'), 或
段分隔符    ('\u2029).

如果激活了 UNIX_LINES 模式,唯一的行结束符就是换行符。
除非你指定了 DOTALL 标志,否则正则表达式.匹配任何字符,只有行结束符除外。
确省情况时,在整个输入队列中,正则表达式^和$忽略行结束符,只匹配开始和结束。
如果激活了 MULTILINE 模式,则^匹配输入的开始和所有行结束符之后,除了整个输入
的结束。
在MULTILINE 模式下,$匹配所有行结束符之前,和整个输入的结束。

Groups and capturing

分组捕获通过从左到右的顺序,根据括号的数量类排序。例如,在表达式((A)(B(C)))中
,有四个组:
1     ((A)(B(C)))
2     (A)
3     (B(C))
4     (C)

0组代表整个表达式。
分组捕获之所以如此命名,是因为在匹配过程中,输入序列的每一个与分组匹配的子序
列都会被保存起来。通过向后引用,被捕获的子序列可以在后面的表达式中被再次使用

而且,在匹配操作结束以后还可以通过匹配器重新找到。
与一个分组关联的被捕获到的输入通常是被保存的最近与这个分组相匹配的队列的子队
列。如果一个分组被第二次求值,即使失败,它的上一次被捕获的值也会被保存起来。
例如,
表达式(a(b)?)+匹配"aba","b"设为子分组。在开始匹配的时候,以前被捕获的输入都
将被清除。
以(?开始的分组是完全的,无需捕获的分组不会捕获任何文本,也不会计算分组总数。

Unicode support

Unicode Technical Report #18: Unicode Regular Expression Guidelines通过轻微的语法改变实现了更深层次的支持。
在java代码中,像\u2014 这样的转义序列,java语言规范中?3.3提供了处理方法

为了便于使用从文件或键盘读取的unicode转义字符,正则表达式解析器也直接实现了这
种转移。因此,字符串"\u2014"与"\\u2014"虽然不相等,但是编译进同一种模式,可以
匹配
十六进制数0x2014。

在Perl中,unicode块和分类被写入\p,\P。如果输入有prop属性,\p{prop}将会匹配,
而\P{prop}将不会匹配。块通过前缀In指定,作为在nMongolian之中。
分类通过任意的前缀Is指定: \p{L} 和 \p{IsL} 都引用 Unicode 字母。块和分类可以
被使用在字符类的内部或外部。

The Unicode Standard, Version 3.0指出了支持的块和分类。块的名字在第14章和 Unicode Character
Database中的 Blocks-3.txt 文件定义,
但空格被剔除了。例如Basic Latin"变成了  "BasicLatin"。分类的名字被定义在88页
,表4-5。

Comparison to Perl 5

Pattern类不支持的Perl构造:
条件构造    (?{X}) 和 (?(condition)X|Y),

嵌入代码构造    (?{code}) 和 (??{code}),

嵌入注释语法    (?#comment), 和

操作预处理   \l \u, \L, and \U.

Perl不支持的Pattern类构造:
所有权量词,它贪婪匹配任意多。
字符类交集和并集。
分享到:
评论

相关推荐

    qt使用正则表达式限制lineEdit的输入,对正则表达式进行了封装,可以直接引入,工程编译正常

    在Qt框架中,正则表达式(Regular Expression)是一种强大的文本处理工具,它允许程序员以结构化的方式匹配、查找、替换或验证字符串。本项目针对Qt的lineEdit组件,通过正则表达式实现了输入限制功能,使得lineEdit...

    正则表达式转换工具

    正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,它用于匹配、查找、替换等操作,涉及字符串处理的各个领域。正则表达式转换工具是专门针对这一需求而设计的,它能帮助用户将输入的内容转换...

    PB实现的正则表达式

    在IT领域,正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,它能够进行复杂的模式匹配、查找、替换等操作。在本话题中,我们将探讨如何使用PowerBuilder 11.5这一经典的开发环境来实现正则...

    C语言正则表达式库

    C语言正则表达式库是用于在C编程环境中处理和匹配正则表达式的软件库。这个库名为PCRE(Perl Compatible Regular Expressions),正如其名,它与Perl语言中的正则表达式语法高度兼容,提供了丰富的功能和强大的匹配...

    易语言正则表达式文本替换

    例如,"子程序_正则文本替换"可能就是一个易语言中用于执行正则表达式替换的子程序,它接收输入的文本、正则表达式模式和替换字符串,然后返回经过替换操作的新文本。 1. **正则表达式基础** - **元字符**:如`.`...

    pb 使用正则表达式源码pbregexp

    标题中的“pb 使用正则表达式源码pbregexp”指的是在PowerBuilder(简称pb)环境中,利用名为“pbregexp”的正则表达式组件来实现源代码级别的正则表达式操作。PowerBuilder是一款流行的可视化的、面向对象的软件...

    Java使用正则表达式提取XML节点内容的方法示例

    Java使用正则表达式提取XML节点内容的方法示例 Java使用正则表达式提取XML节点内容的方法示例主要介绍了Java使用正则表达式提取XML节点内容的方法,结合具体实例形式分析了java针对xml格式字符串的正则匹配相关操作...

    易语言正则表达式匹配中文

    在易语言中,正则表达式是进行文本处理、数据提取和搜索的关键工具,尤其在处理中文字符时显得尤为重要。本文将深入探讨易语言中的正则表达式匹配中文的原理、方法以及应用。 正则表达式(Regular Expression)是一...

    正则表达式在数据库查询中的应用

    ### 正则表达式在数据库查询中的应用 #### 引言 在数据库管理与应用程序开发中,查询数据是一项常见的任务。传统的SQL查询虽然强大,但在处理复杂查询时可能存在一定的局限性,尤其是涉及到文本数据的模式匹配时。...

    正则表达式调试工具

    正则表达式(Regular Expression,简称regex)是用于在文本中匹配特定模式的强大工具,广泛应用于数据验证、搜索替换和文本处理等领域。正则表达式调试工具是开发人员用来测试和优化这些模式的重要辅助工具。本文将...

    VC、VC++,MFC 正则表达式类库

    正则表达式类库则为VC++和MFC的开发者提供了对正则表达式功能的支持。 "VC、VC++,MFC 正则表达式类库"指的是在MFC中实现或集成的正则表达式处理模块。这个库通常包含一系列的类和函数,允许程序员编写符合特定模式...

    易语言正则表达式类匹配中文

    在易语言中,正则表达式类是一个非常重要的工具,用于处理字符串的模式匹配和查找。在处理中文文本时,这个功能尤为关键,因为中文字符的编码和处理方式与英文有所不同。 正则表达式是用于匹配字符串模式的一种强大...

    正则表达式测试工具C#版(src)

    正则表达式是一种强大的文本处理工具,用于在字符串中进行模式匹配和搜索。在C#编程语言中,正则表达式被广泛应用于数据验证、文本提取、格式转换等多个场景。本项目提供了一个C#编写的正则表达式测试工具,包含完整...

    c++写的正则表达式验证工具

    在IT行业中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找、替换等操作。C++作为一种通用编程语言,虽然标准库中没有内置正则表达式支持,但通过第三方库如Boost,我们可以很方便地在...

    通过正则表达式生成数据

    正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,它用于匹配、查找、替换等操作,涉及字符串的模式匹配。在本主题中,我们将深入探讨如何使用正则表达式来生成满足特定条件的随机数据。这在...

    C#正则表达式大全, 判断字符串是否为正整数,中文,英文.....

    C# 正则表达式大全 正则表达式是指用来描述字符串模式的表达式,通过使用正则表达式,我们可以轻松地实现字符串的匹配、验证、提取和替换等操作。在 C# 中,我们可以使用 System.Text.RegularExpressions 命名空间...

    C正则表达式库

    在IT领域,正则表达式库是用于处理字符串匹配、搜索和替换的重要工具。在C语言环境中,GUN(GNU)提供了一个官方的正则表达式库,这使得C程序员可以方便地在他们的应用程序中利用正则表达式的强大功能。本篇文章将...

    易语言正则表达式取网址和名称

    在IT行业中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找、替换等操作。在本案例中,“易语言正则表达式取网址和名称”指的是使用易语言这一编程环境,结合正则表达式技术来从文本中...

    根据正则表达式生成满足正则的数据

    在IT领域,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配字符串模式。它们广泛应用于数据验证、搜索、替换等操作。本话题主要关注如何根据正则表达式生成满足该模式的数据,这在测试、数据...

    详解Java判断是否是整数,小数或实数的正则表达式

    在Java中使用正则表达式来判断字符串是否符合整数、小数或实数的格式是一种常见且有效的做法。在编程中,我们经常需要对输入的字符串进行格式验证,以确保它们符合预期的数值格式,尤其是在处理财务数据、用户输入...

Global site tag (gtag.js) - Google Analytics