2013-03-06 81 views
2

假設我需要匹配包含空格的圓括號。Java的掃描儀。如何匹配空白?

這裏是一個片段:

String input = "() () ()"; 
Pattern pattern = Pattern.compile("\\(\\s\\)"); 

Scanner scanner = new Scanner(input); 
scanner.useDelimiter("\\n"); 
Matcher matcher = pattern.matcher(input); 

System.out.println(scanner.hasNext(pattern)); // false 
System.out.println(matcher.find()); // true 
System.out.println(matcher.start(0) + " " + matcher.end(0)); // 0 3 

匹配器不正是我需要的,但掃描儀不。

這個問題沒有被正確的問到。我的目的是用掃描器順序地抓取所有()令牌,因爲匹配器似乎對於這樣的任務有不方便的API。 我應該仔細閱讀文檔。

我需要的方法是:

scanner.findInLine(pattern); 
+1

[Java,正則表達式捕獲字符串與空白]的可能的副本(http://stackoverflow.com/questions/13313493/java-regular-expression-catching-string-with-white-space) – guerda 2013-03-06 15:22:19

+0

小記事:如果您想使用新行作爲分隔符,請不要使用\\ n,而應該使用\ n或者更好的System.getProperty(「line.separator」)結果。 – Pshemo 2013-03-06 15:30:30

+0

身體似乎不清楚支持標題。問題究竟是什麼? – 2013-03-06 15:38:54

回答

1

檢查從Scanner.hasNext的Javadoc(模式):

返回true如果未來完整標記匹配指定模式...

所以,既然你沒有按模式」 t匹配整個令牌"() () ()"它將返回false。然而

Scanner有一個名爲findInLine功能,可以做你想做的:

scanner.findInLine(pattern); // returns "()" or null if not found 

(但是,這種方法可以跳過字符...)

+0

「但是,這種方法可以跳過字符」 - 你是什麼意思? – dmiandre 2013-03-06 16:11:07

+0

如果你有一行'hello()world()()「,那麼第一次調用將會找到第一個'」()「'有效地跳過''hello''第二次調用將會找到第二個(跳過''世界「),第三個電話會找到第三個。第四次調用將返回'null'。 – dacwe 2013-03-06 16:42:01

+0

這正是我需要的,謝謝! – dmiandre 2013-03-11 15:46:27

0
 String input = "() () ()"; 
     Pattern pattern = Pattern.compile("\\(\\s\\)"); 

     Scanner scanner = new Scanner(input); 
     scanner.useDelimiter(pattern); //**CHANGED** 
     Matcher matcher = pattern.matcher(input); 

     System.out.println(scanner.hasNext()); //**CHANGED** 
     System.out.println(matcher.find()); 
     System.out.println(matcher.start(0) + " " + matcher.end(0)); // 0 3 

更新你的代碼如上。

你誤會了useDelimiter()。您必須將Pattern設置爲您的Scanner對象的分隔符。

+1

我需要抓住()不要被它分裂。在你的情況scanner.next()不返回()。 – dmiandre 2013-03-06 15:52:10

1

當您使用"\\n"作爲分隔符(和因此覆蓋作爲空格的缺省值),整個輸入"() () ()"就成爲一個標記。

由於hasNext嘗試匹配完整令牌返回falsepattern

從文檔的方法,如果下一個完整標記與指定模式匹配Scanner.hasNext(Pattern pattern)

返回true。

所以在你的情況下,方法調用實際上是試圖匹配"() () ()""()"