web-dev-qa-db-ja.com

Java文字列分割が正しい値を返さない

再帰下降パーサーで使用される文法を表すtxtファイルを解析しようとしています。 txtファイルは次のようになります。

SPRIME :: = Expr eof
Expr :: = Term Expr '
Expr ':: = + Term Expr' | --Term Expr '| e

左側を分離し、右側を個別のプロダクションルールに分割するために、各行を取得して次のように呼び出します。

String[] firstSplit = line.split("::=");
String LHS = firstSplit[0];
String productionRules = firstSplit[1].split("|");

ただし、2番目のsplitメソッドを呼び出すと、「|」で区切られた文字列の配列が返されません。文字ですが、右側にある「|」を含む個々の文字の配列です。したがって、たとえば、Exprのルールを解析してproductionRules配列を出力した場合、次のようになります。

「+」
"期間"
"Expr '"
""
"|"

私が本当に欲しいものがこのように見えるべきとき:

  • 期間Expr '

誰かが私が間違っていることについて何か考えがありますか?

21
Richard Stokes

splitは引数として正規表現を使用するため、意図しないすべての正規表現シンボルをエスケープする必要があります。

22
dcn

String.split()のパラメーターは正規表現であり、縦棒文字は特殊です。

バックスラッシュでエスケープしてみてください。

String productionRules = firstSplit[1].split("\\|");

注意:バックスラッシュ文字自体は文字列リテラル内で特別であるため、2つのバックスラッシュが必要です。

55
Alnitak

パイプをエスケープする必要があります(|regexOR演算子である記号。

String productionRules = firstSplit[1].split("\\|");

または

String productionRules = firstSplit[1].split(Pattern.quote("|"));
11

パイプ文字は、「または」の正規表現演算子です。あなたが欲しいのは

String productionRules = firstSplit[1].split("\\|");

これは、実際のパイプ文字を探すように指示します。

7
Jon Bright