2

java のトークンを使用して文字列を分割したいと考えています。例えば;

String s = "A#B^C&D!ased&acdf@Mhj%"
String temp[] = s.split("[#^&!@%]+");

Current output :-
temp[0] = A
temp[1] = B
temp[2] = C
temp[3] = D
temp[4] = ased

output which i want :-
temp[0] = A#
temp[1] = B^
temp[2] = C&
temp[3] = D!
temp[4] = ased&

My current approach of doing is 
  pos =  find the index of the token in string
  pos = add the size of the token in pos
  charAtPos  = getcharfrom string at index pos
  token = token + charAtPos  

あなたがそれを行うためのより良い方法があれば提案してください。非常に大きな Strings では、アプローチはあまり効率的ではないと思います。

4

4 に答える 4

5

入力をキャプチャしない正規表現構造である肯定的な後読みを使用してみてください。

String s = "A#B^C&D!ased&acdf@Mhj%";
String temp[] = s.split("(?<=[#^&!@%]+)");

コンストラクトは、それ自体をキャプチャせずに(?<=expr)の直後のポイントで一致するため、セパレータに続く位置でテキストを分割できます。exprexpr

これはideoneのデモです。

于 2013-04-30T13:32:54.603 に答える
1

非常に大きな文字列を処理する必要がある場合は、独自のコードを作成する方がよいでしょう。Java パターン マッチング エンジンは優れた汎用ツールですが、多くの場合、カスタム コードよりも優れたパフォーマンスを発揮します。

重要なのは、Apache Commons StringUtils ライブラリのようなものを使用することです。これは非常に使いやすく、標準の Java ボキャブラリには欠けている機能が多数含まれています。

関数:

i = StringUtils.indexOfAny("A#B^C&D!ased&acdf@Mhj%","[#^&!@%]+");

最初の区切り文字のインデックスを取得します。フロントを切り取って配列を反復処理するのはあなた次第です。

于 2013-04-30T13:39:22.000 に答える
1

String#split()正規表現を使用して分割位置を見つけ、一致するグループを結果から削除します (これらは通常不要なトークンです)。トークンも取得したい場合は、先読み後読みを使用して長さゼロの一致が必要です。

String s = "A#B^C&D!ased&acdf@Mhj%"
String temp[] = s.split("(?<=[#^&!@%]+)");

式は、トークンのの各位置に一致するように変更され、長さゼロの一致が作成されます。したがって、結果にはトークンも含まれます。

于 2013-04-30T13:25:29.243 に答える
0

split メソッドは、正規表現の一致を中心に分割するため、おそらくそうする必要があります[#|^|&|!|@|%]

于 2013-04-30T13:23:59.953 に答える