1

さまざまな文字を区切り文字として使用して文字列を分割し、それらの区切り文字を独自の配列インデックスに保持しようとしています。たとえば、文字列を分割したいとします。

if (x>1) return x * fact(x-1);

「(」、「>」、「)」、「*」、「-」、「;」を使用 '\s' を区切り文字として使用します。出力を次の文字列配列にしたい: {"if", "(", "x", ">", "1", ")", "return", "x", "*", "fact "、"("、"x"、"-"、"1"、")"、";"}

私がこれまでに使用している正規表現は split("(?=(\\w+(?=[\\s\\+\\-\\*/<(<=)>(>=)(==)(!=)=;,\\.\"\\(\\)\\[\\]\\{\\}])))")

区切り文字のいずれかが続くかどうかに関係なく、各単語文字で分割されます。例えば

テスト + 1

{"test+", "1"} の代わりに {"t","e","s","t+","1"} を出力します

その文字の後に区切り文字が 1 つも続かない場合でも、各文字で分割されるのはなぜですか? また、Javaでもこれを可能にする正規表現はありますか? ありがとうございました

4

3 に答える 3

5

ルックアラウンドを使用して、区切り文字を消費せずに文字間のポイントを分割できます。

(?<=[()>*-;\s])|(?=[()>*-;\s])

これにより、各区切り文字の前後に分割ポイントが作成されます。ただし、結果の配列から余分な空白要素を削除する必要がある場合があります。

クイック PowerShell テスト (|分割ポイントをマーク):

PS Home:\> 'if (x>1) return x * fact(x-1);' -split '(?<=[()>*-;\s])|(?=[()>*-;\s])' -join '|'
if| |(|x|>|1|)| |return| |x| |*| |fact|(|x|-|1|)|;|
于 2012-11-14T05:50:57.787 に答える
0

「なぜ?」という質問に答えるには、式全体が先読みアサーションだからです。その主張が各キャラクターで真である限り (または、「間」と言うべきかもしれません)、分割することができます。

また、文字クラス内でグループ化することはできません。たとえば (<=)、あなたが思っていることをしていません。

于 2012-11-14T05:52:50.177 に答える
0

このパターンはどうですか?

(\w+)|([\p{P}\p{S}])
于 2012-11-14T05:49:29.357 に答える