2016-07-03 3 views
2

与えられた文字列1.5 + 2、私は解析し、Double、演算子、および整数を処理したいと思います。DoublesとStringsの両方を解析するカスタムデリミタを備えたスキャナですか?

以下のコードは、小数点以下が含まれていない文字列の期待通りに動作しますが、与えられた入力のためには、印刷します。

1.5 + 2

1 . 5 + 2

私は印刷にそれをたいと思いますが

カスタム正規表現を使用してScannerクラスを使用すると可能ですか?

String delimiter = "(?:\\s+)|(?<=[+)|(?=[+])"; 

Scanner scanner = new Scanner("1.5 + 2"); 
scanner.useDelimiter(delimiter); 

while (scanner.hasNext()) { 
    String token = scanner.next(); 
    System.out.println(token); 
} 
+2

あなたが区切り文字としてスペースを使用していない理由はありますか? – intboolstring

+0

はい、私は指定したはずです。入力が "1.5 + 2"の場合は、1.5、+、2を出力する必要があります。 – ab11

+0

空白を処理する独自の[RDP](https://en.wikipedia.org/wiki/Recursive_descent_parser)を設計する必要があります。 。 – ChiefTwoPencils

答えて

0

* 盗み さて、なぜ空白からの入力をカットしない* intboolstring's commentからのアイデアを取得?

String delimiter = "\\s+"; 

説明:上記の文字列は、1つ以上のスペース/タブ/改行に一致する正規表現\s+あります。

+0

私は指定しておくべきです、空白に関係なく解析する必要があります。入力が「1.5 + 2」の場合は、1.5、+、2が出力されます。 – ab11

0

分割する場所(split()またはScannerの場合)のパターンを書き込む代わりに、まとめたいもののパターンを書き込む方が簡単かもしれません。

例:

Pattern exprPattern = Pattern.compile("\\d+(?:\\.\\d+)?" +  // digits [ '.' digits ] 
            "|\\.\\d+" +    // '.' digits 
            "|[a-zA-Z][a-zA-Z0-9]*" + // identifier 
            "|\\S");     // any single non-whitespace 
String expr = "1.5 + 7.2*(var3 - .1)"; 
for (Matcher m = exprPattern.matcher(expr); m.find();) 
    System.out.println(m.group()); 

出力

1.5 
+ 
7.2 
* 
(
var3 
- 
.1 
) 
+2

が意味を持ちます。しかし、この時点では、String.charAt()で解析ロジックを書く方が簡単かもしれないと思いますか? – ab11

関連する問題