1

次のような一連の文字列を考えてみましょう。

Memory size = 4,194,304 KB
Cache size=   32,768 K
Number of cores = 8
Note   =4,000,000 KB is less than 4 GB

各文字列に完全に一致し、次のグループを生成する一般的であまり複雑でない Java 正規表現はありますか?

"Memory size", "4,194,304", "KB"
"Cache size", "32,768", "K"
"Number of cores", "8"
"Note", "4,000,000 KB is less than 4 GB"

これらのグループはkeyvalueおよび (オプション)suffixです。

追加要件:

  • 値 (つまり、'=' の後の部分) は必ずしも数値ではありません
  • 「:」の両側にあるスペースは、後戻りせずに一度に削除する必要があります
  • 「KB」と「K」の文字列の一致では、大文字と小文字が区別されません
  • キャプチャされたグループは常に同じインデックスを持つ必要があります (理想的には、キー/値/サフィックスに 3 つのグループがあり、すべての一致に同じグループ インデックスがあります)。

明らかに、次のような単純な式

  • ([^=]+) *: *([^=]+)

上記の仕様を完全にはカバーしていません。

4

3 に答える 3

2

上記の仕様を完全にカバーする正規表現は次のとおりです。

^([^=]+?) *= *(.+?) *$

編集

K/KB の部分を見逃していたことが判明しました。修正版は次のとおりです。

^([^=]+?) *= *(.+?) *(KB?)? *$
于 2013-01-28T11:30:38.373 に答える
2

このようなものが動作するはずです:

^(.*?)\s*=\s*(?:([\d,]+)\s*(K|KB)$|(.*))

^- 行頭に一致

(.*?)何にでもマッチすることで左の用語をキャプチャします (?非貪欲にします。そうしないと、すべての空白を使い果たしてしまいます)。

\s*=\s*等号とその前後のスペースを一致させて破棄します。

(?:([\d,]+)\s*(K|KB)$|(.*))この長いグループは、どちらか一方に一致します。(?:全体をキャプチャしたくないため、非キャプチャ グループにします。

([\d,]+)\s*(K|KB)$ 数字の後に K または KB と文字列の末尾が続く場合は、2 つのグループで一致させます。

(.*)それ以外の場合は、1 つのグループに残っているすべてのものと一致します。

于 2013-01-28T11:34:10.237 に答える
0

試してみて、うまくいったかどうか教えてください:

(.*) *= *(.*) (.*)
于 2013-01-28T11:31:12.677 に答える