2013-01-22 31 views
1

我试图从使用'java.util.regex.Pattern'的文本文件中捕获赋值操作。我一直非常沮丧地尝试修正我的正则表达式,以便真正识别我正在寻找的内容。我尽可能简化了问题,并发现了一个拾取空白的问题。Java正则表达式空白不被识别

This post proved helpful,并揭示了处理空白字符集问题轻,但不回答为什么下面的问题是不工作:

Pattern p = Pattern.compile("adfa ="); 
Scanner sc = new Scanner("adfa ="); 

if(sc.hasNext(p)) 
{ 
    String s = sc.next(p); 
    System.out.println(">" + s + "<"); 
} 
else 
    System.out.println(":("); 

如果我试试这个:

Pattern p = Pattern.compile("\\w+ *="); 

接下来的字符串是:

"adfa=" 

但是不是:

"adfa =" 

只需通过进行以下更改:

Pattern p = Pattern.compile("adfa="); 
Scanner sc = new Scanner("adfa="); 

所有作品意!任何人都可以阐明发生了什么问题?

回答

5

从文档,Scanner#hasNext(Pattern): -

返回如果下一个完整标记与指定模式匹配真实。 完整的令牌前缀和后缀与输入相匹配的 定界符模式。

现在,由于Scanner的默认分隔符模式是\p{javaWhitespace}+。它找出来用Scanner#delimiter()方法: -

Scanner sc = new Scanner("abdc ="); 
System.out.println(sc.delimiter()); // Prints \p{javaWhitespace}+ 

所以,当您遇到Scanner在你的字符串whitespace。它假定token已结束。因此,在那里停下来,并尝试将读取的令牌与您的模式相匹配。当然它失败了,因此sc.hasNext(p)返回false。这就是问题。

+0

编辑:只要读取默认确实是任何空格。谢谢!不知道我是如何设法不读的,并假定分隔符是'\ n'或EOF。 – Daeden

+0

@Daeden ..尝试打印'sc.delimiter()'的值。你会得到'\ p {javaWhitespace} +'。我希望能够说清楚。 –

+0

@Daeden。不客气:) –

2

Scanner.hasNext(Pattern) javadoc:如果下一个完整标记与指定的模式匹配,则返回true。一个完整的标记由与分隔符模式匹配的输入前缀和后缀。

在扫描仪中,withespace是默认分隔符,因此在您的示例中,扫描仪会尝试将标记“adfa”与正则表达式匹配,该标记不匹配。如果你改变了分隔符别的东西,像一个换行符:

sc.useDelimiter("\n"); 

您正则表达式应该工作。

编辑:我的回答有点晚!

+0

我很欣赏你的回应! – Daeden