0

phpとjavaには、句読点なしで文字列を配列に変換するexplode関数とtokenizer関数があります。仕事をするための関数またはデルファイの何らかの方法です。大きなファイルがあるとします。「これは、句読点とスペースと数字が123の大きなファイルです...」配列を取得するにはどうすればよいですか?「これは句読点とスペースと数字が123の大きなファイルです」

事前にどうもありがとうございました。

はい、正規表現の\ wのように、[0..9]、[a..z]、[A..Z]のみが必要です。Tperlregexで正規表現を使用して\wを抽出し、tstringlistが配列であるかのように、それらをTstringlistに配置できますが、それほど効率的ではない可能性がありますか?ありがとうございました。

4

3 に答える 3

4

文字列を取り、文字列の配列を返す関数が必要な場合、これらの文字列は句読点で区切られた元の部分文字列であり、Eugene が以前の回答で提案したように、次のことができます。

type
  StringArray = array of string;
  IntegerArray = array of integer;
  TCharSet = set of char;

function split(const str: string; const delims: TCharSet): StringArray;
var
  SepPos: IntegerArray;
  i: Integer;
begin
  SetLength(SepPos, 1);
  SepPos[0] := 0;
  for i := 1 to length(str) do
    if str[i] in delims then
    begin
      SetLength(SepPos, length(SepPos) + 1);
      SepPos[high(SepPos)] := i;
    end;
  SetLength(SepPos, length(SepPos) + 1);
  SepPos[high(SepPos)] := length(str) + 1;
  SetLength(result, high(SepPos));
  for i := 0 to high(SepPos) -  1 do
    result[i] := Trim(Copy(str, SepPos[i] + 1, SepPos[i+1] - SepPos[i] - 1));
end;

例:

const
  PUNCT = ['.', ',', ':', ';', '-', '!', '?'];

procedure TForm4.FormCreate(Sender: TObject);
var
  str: string;
begin
  for str in split('this, is, a! test!', PUNCT) do
    ListBox1.Items.Add(str)
end;
于 2010-10-22T14:48:52.650 に答える
2

これは、「英数字」と「パンカット文字」の定義によって異なります。

たとえば、句読文字のセットを定義する場合

const
  PUNCT = ['.', ',', ':', ';', '-', '!', '?'];

他のすべての文字を英数字と見なすと、次のことができます。

function RemovePunctuation(const Str: string): string;
var
  ActualLength: integer;
  i: Integer;
const
  PUNCT = ['.', ',', ':', ';', '-', '!', '?'];
begin
  SetLength(result, length(Str));
  ActualLength := 0;
  for i := 1 to length(Str) do
    if not (Str[i] in PUNCT) then
    begin
      inc(ActualLength);
      result[ActualLength] := Str[i];
    end;
  SetLength(result, ActualLength);
end;

この関数は、文字列を文字列に変換します。代わりに文字列を文字の配列に変換したい場合は、

type
  CharArray = array of char;

function RemovePunctuation(const Str: string): CharArray;
var
  ActualLength: integer;
  i: Integer;
const
  PUNCT = ['.', ',', ':', ';', '-', '!', '?'];
begin
  SetLength(result, length(Str));
  ActualLength := 0;
  for i := 1 to length(Str) do
    if not (Str[i] in PUNCT) then
    begin
      result[ActualLength] := Str[i];
      inc(ActualLength);
    end;
  SetLength(result, ActualLength);
end;

(はい、Delphiでは、文字列は1ベースのインデックスを使用しますが、配列は0ベースのインデックスを使用します。これは歴史的な理由によるものです。)

于 2010-10-22T14:35:16.460 に答える
0

Javaトークナイザーのような組み込み機能はないようです。かなり前に、ElPack コンポーネント スイート (現在は LMD ElPack) の一部となった Java クラスに似たトークナイザー クラスを作成しました。Java に似た文字列トークナイザーの実装を次に示します (Google でこのリンクを見つけたので、コードの品質についてコメントすることはできません)。

于 2010-10-22T14:46:26.800 に答える