随笔-28  评论-51  文章-10  trackbacks-0
1以前一直把Scanner的nextLine()方法理解错了:||
String java.util.Scanner.nextLine()
Advances 
this scanner past the current line and returns the input that was skipped. This method returns the rest of the current line, excluding any line separator at the end. The position is set to the beginning of the next line. 

Since 
this method continues to search through the input looking for a line separator, it may buffer all of the input searching for the line to skip if no line separators are present. 

Returns:
the line that was skipped
Throws:
NoSuchElementException 
if no line was found
IllegalStateException 
if this scanner is closed
2pku1008中的数据获取识别

10. zac 0
   Scanner cin = new Scanner(new BufferedInputStream(System.in));
   cin.useDelimiter("\\.*\\s");
使用正则表达式轻松搞定,然后使用cin.next()获取即可
3正则表达式基础
正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,我们下面会给予解释。

在最简单的情况下,一个正则表达式看上去就是一个普通的查找串。例如,正则表达式
"testing"中没有包含任何元字符,,它可以匹配"testing""123testing"等字符串,但是不能匹配"Testing"

要想真正的用好正则表达式,正确的理解元字符是最重要的事情。下表列出了所有的元字符和对它们的一个简短的描述。

元字符         描述
        
.
        匹配任何单个字符。例如正则表达式r.t匹配这些字符串:rat、rut、r t,但是不匹配root。
$
        匹配行结束符。例如正则表达式weasel$ 能够匹配字符串
"He's a weasel"的末尾,但是不能匹配字符串"They are a bunch of weasels."
^
        匹配一行的开始。例如正则表达式
^When in能够匹配字符串"When in the course of human events"的开始,但是不能匹配"What and When in the"
*
        匹配0或多个正好在它之前的那个字符。例如正则表达式.
*意味着能够匹配任意数量的任何字符。
\
        这是引用符,用来将这里列出的这些元字符当作普通的字符来进行匹配。例如正则表达式\$被用来匹配美元符号,而不是行尾,类似的,正则表达式\.用来匹配点字符,而不是任何字符的通配符。
[ ]
[c1
-c2]
[
^c1-c2]
        匹配括号中的任何一个字符。例如正则表达式r[aou]t匹配rat、rot和rut,但是不匹配ret。可以在括号中使用连字符
-来指定字符的区间,例如正则表达式[0-9]可以匹配任何数字字符;还可以制定多个区间,例如正则表达式[A-Za-z]可以匹配任何大小写字母。另一个重要的用法是“排除”,要想匹配除了指定区间之外的字符——也就是所谓的补集——在左边的括号和第一个字符之间使用^字符,例如正则表达式[^269A-Z] 将匹配除了2、6、9和所有大写字母之外的任何字符。
\
< \>
        匹配词(word)的开始(\
<)和结束(\>)。例如正则表达式\<the能够匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:这个元字符不是所有的软件都支持的。
( )
        将 ( 和 ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \
1 到\9 的符号来引用。
|
        将两个匹配条件进行逻辑“或”(Or)运算。例如正则表达式(him
|her) 匹配"it belongs to him""it belongs to her",但是不能匹配"it belongs to them."。注意:这个元字符不是所有的软件都支持的。
+
        匹配1或多个正好在它之前的那个字符。例如正则表达式9
+匹配9、99、999等。注意:这个元字符不是所有的软件都支持的。
?
        匹配0或1个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的。
{i}
{i,j}
        匹配指定数目的字符,这些字符是在它之前的表达式定义的。例如正则表达式A[
0-9]{3} 能够匹配字符"A"后面跟着正好3个数字字符的串,例如A123、A348等,但是不匹配A1234。而正则表达式[0-9]{4,6} 匹配连续的任意4个、5个或者6个数字字符。注意:这个元字符不是所有的软件都支持的。

最简单的元字符是点,它能够匹配任何单个字符(注意不包括新行符)。假定有个文件test.txt包含以下几行内容:

4jdk5.0中java.util.regex.Pattern的详细说明
public final class Patternextends Objectimplements Serializable正则表达式的编译表示形式。 

指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。 

因此,典型的调用顺序是 

 Pattern p 
= Pattern.compile("a*b");
 Matcher m 
= p.matcher("aaaaab");
 
boolean b = m.matches();在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句 

 
boolean b = Pattern.matches("a*b""aaaaab");等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。 
此类的实例是不可变的,可供多个并发线程安全使用。Matcher 类的实例用于此目的则不安全。 

正则表达式的构造摘要 
构造 匹配 
  
字符 
x 字符 x 
\\ 反斜线字符 
\0n 带有八进制值 
0 的字符 n (0 <= n <= 7
\0nn 带有八进制值 
0 的字符 nn (0 <= n <= 7
\0mnn 带有八进制值 
0 的字符 mnn(0 <= m <= 30 <= n <= 7) 
\xhh 带有十六进制值 0x 的字符 hh 
\uhhhh 带有十六进制值 0x 的字符 hhhh 
\t 制表符 (
'\u0009'
\n 新行(换行)符 (
'\u000A'
\r 回车符 (
'\u000D'
\f 换页符 (
'\u000C'
\a 报警 (bell) 符 (
'\u0007'
\e 转义符 (
'\u001B'
\cx 对应于 x 的控制符 
  
字符类 
[abc] a、b 或 c(简单类) 
[
^abc] 任何字符,除了 a、b 或 c(否定) 
[a
-zA-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) 
\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}\x20] 
\p{Blank} 空格或制表符:[ \t] 
\p{Cntrl} 控制字符:[\x00
-\x1F\x7F] 
\p{XDigit} 十六进制数字:[
0-9a-fA-F] 
\p{Space} 空白字符:[ \t\n\x0B\f\r] 
  
java.lang.Character 类(简单的 java 字符类型) 
\p{javaLowerCase} 等效于 java.lang.Character.isLowerCase() 
\p{javaUpperCase} 等效于 java.lang.Character.isUpperCase() 
\p{javaWhitespace} 等效于 java.lang.Character.isWhitespace() 
\p{javaMirrored} 等效于 java.lang.Character.isMirrored() 
  
Unicode 块和类别的类 
\p{InGreek} Greek 块(简单块)中的字符 
\p{Lu} 大写字母(简单类别) 
\p{Sc} 货币符号 
\P{InGreek} 所有字符,Greek 块中的除外(否定) 
[\p{L}
&&[^\p{Lu}]]  所有字母,大写字母除外(减去) 
  
边界匹配器 
^ 行的开头 
$ 行的结尾 
\b 单词边界 
\B 非单词边界 
\A 输入的开头 
\G 上一个匹配的结尾 
\Z 输入的结尾,仅用于最后的结束符(如果有的话) 
\z 输入的结尾 
  
Greedy 数量词 
X
? X,一次或一次也没有 
X
* X,零次或多次 
X
+ X,一次或多次 
X{n} X,恰好 n 次 
X{n,} X,至少 n 次 
X{n,m} X,至少 n 次,但是不超过 m 次 
  
Reluctant 数量词 
X
?? X,一次或一次也没有 
X
*? X,零次或多次 
X
+? X,一次或多次 
X{n}
? X,恰好 n 次 
X{n,}
? X,至少 n 次 
X{n,m}
? X,至少 n 次,但是不超过 m 次 
  
Possessive 数量词 
X
?+ X,一次或一次也没有 
X
*+ X,零次或多次 
X
++ X,一次或多次 
X{n}
+ X,恰好 n 次 
X{n,}
+ X,至少 n 次 
X{n,m}
+ X,至少 n 次,但是不超过 m 次 
  
Logical 运算符 
XY X 后跟 Y 
X
|Y X 或 Y 
(X) X,作为捕获组 
  
Back 引用 
\n 任何匹配的 nth 捕获组 
  
引用 
\ Nothing,但是引用以下字符 
\Q Nothing,但是引用所有字符,直到 \E 
\E Nothing,但是结束从 \Q 开始的引用 
  
特殊构造(非捕获) 
(
?:X) X,作为非捕获组 
(
?idmsux-idmsux)  Nothing,但是将匹配标志由 on 转为 off 
(
?idmsux-idmsux:X)   X,作为带有给定标志 on - off 的非捕获组 
(
?=X) X,通过零宽度的正 lookahead 
(
?!X) X,通过零宽度的负 lookahead 
(
?<=X) X,通过零宽度的正 lookbehind 
(
?<!X) X,通过零宽度的负 lookbehind 
(
?>X) X,作为独立的非捕获组 

--------------------------------------------------------------------------------

反斜线、转义和引用 
反斜线字符 (
'\') 用于引用转义构造,如上表所定义的,同时还用于引用其他将被解释为非转义构造的字符。因此,表达式 \\ 与单个反斜线匹配,而 \{ 与左括号匹配。 

在不表示转义构造的任何字母字符前使用反斜线都是错误的;它们是为将来扩展正则表达式语言保留的。可以在非字母字符前使用反斜线,不管该字符是否非转义构造的一部分。 

根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 
"\b" 与单个退格字符匹配,而 "\\b" 与单词边界匹配。字符串字面值 "\(hello\)" 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 "\\(hello\\)"。 

字符类 
字符类可以出现在其他字符类中,并且可以包含并集运算符(隐式)和交集运算符 (
&&)。并集运算符表示至少包含其某个操作数类中所有字符的类。交集运算符表示包含同时位于其两个操作数类中所有字符的类。 

字符类运算符的优先级如下所示,按从最高到最低的顺序排列: 

1     字面值转义     \x 
2     分组 [
3     范围 a-
4     并集 [a-e][i-u] 
5     交集 [a-z&&[aeiou]] 

注意,元字符的不同集合实际上位于字符类的内部,而非字符类的外部。例如,正则表达式 . 在字符类内部就失去了其特殊意义,而表达式 
- 变成了形成元字符的范围。 

行结束符 
行结束符 是一个或两个字符的序列,标记输入字符序列的行结尾。以下代码被识别为行结束符: 

新行(换行)符 (
'\n')、 
后面紧跟新行符的回车符 (
"\r\n")、 
单独的回车符 (
'\r')、 
下一行字符 (
'\u0085')、 
行分隔符 (
'\u2028') 或 
段落分隔符 (
'\u2029)。 
如果激活 UNIX_LINES 模式,则新行符是惟一识别的行结束符。 

如果未指定 DOTALL 标志,则正则表达式 . 可以与任何字符(行结束符除外)匹配。 

默认情况下,正则表达式 
^ 和 $ 忽略行结束符,仅分别与整个输入序列的开头和结尾匹配。如果激活 MULTILINE 模式,则 ^ 在输入的开头和行结束符之后(输入的结尾)才发生匹配。处于 MULTILINE 模式中时,$ 仅在行结束符之前或输入序列的结尾处匹配。 

组和捕获 
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组: 

1     ((A)(B(C))) 
2     \A 
3     (B(C)) 
4     (C) 

组零始终代表整个表达式。
组捕获测试
//         String input = "1 fish 2 fish red fish blue fish";
//         Scanner s = new Scanner(input);
//         s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
//         MatchResult result = s.match();
//         for (int i=1; i<=result.groupCount(); i++)
//             System.out.println(result.group(i));
//         s.close();


之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器检索。 

与组关联的捕获输入始终是与组最近匹配的子序列。如果由于量化的缘故再次计算了组,则在第二次计算失败时将保留其以前捕获的值(如果有的话)例如,将字符串 
"aba" 与表达式 (a(b)?)+ 相匹配,会将第二组设置为 "b"。在每个匹配的开头,所有捕获的输入都会被丢弃。 

以 (
?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。 



posted on 2007-11-11 20:17 fullfocus 阅读(519) 评论(0)  编辑  收藏 所属分类: JAVA/J2EE

只有注册用户登录后才能发表评论。


网站导航: