2013-04-15 31 views
1

试图解析这个简单的字符串分隔符为两个float变量原来是没有价值的,比我最初以为:如何表示“ ”作为扫描仪

-0.13 0.17% 

的(?唯一的)原因是,两个数字之间的空格实际上是 。因此,第一个scanner.next()返回整个字符串:

Scanner scanner = new Scanner("-0.13 0.17%"); 
String first = scanner.next(); 

我知道扫描仪的useDelimiter()方法,但我怎么告诉它使用 作为分隔符?

我想useDelimiter(" "),但没有奏效

我在做什么错?

回答

2

Scanner类缺省的分隔符是\p{javaWhitespace}+\p{javaWhitespace}由方法Character.isWhitespace定义,该方法根据定义排除了非间断空格。

根据Java确定指定的字符是否为空格。一个字符是一个Java空白字符,当且仅当它满足以下条件之一:

  • 它是Unicode空格字符(SPACE_SEPARATORLINE_SEPARATOR,或PARAGRAPH_SEPARATOR),但不也是非打破空间('\u00A0''\u2007''\u202F')。
  • [...]

如果你想包括无休息空间,这是'\u00A0'也是默认的Java空格,你需要构建一个将它们组合在一起的正则表达式:

scanner.useDelimiter("[\\p{javaWhitespace}\u00A0]+"); 

请注意,+落后很重要。它导致整个模式匹配连续的空白序列。如果没有这个,当有连续的​​空格时,next()将返回空字符串。

2

和号转义序列只能在HTML和XML中使用,而不能在Java中使用。尝试改用"\u00a0"

+0

This Works!谢谢。但我也尝试过'useDelimiter(“\\ s”)',它也可以。所以现在突然间我有3种不同的方式可以工作。 :)哪一个最好? –

+0

@RegexRookie:'\\ s'不应该工作,除非字符串不包含不间断空格。 – nhahtdh

2

160的ASCII码是nbsp,所以用字符串连接一个带有该值的字符,它应该可以工作。

char nbsp = 160; 
useDelimiter("" + nbsp); 
+2

这是一个Unicode序数,而不是ASCII。 – Taymon

+1

@Taymon其实这个也适用于我(除了你的''\ u00a0'''建议)。哪个更好? –