2013-01-22 29 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