web-dev-qa-db-ja.com

Dartで文字列を検索して置換する

このアプリにフラッターを使用していますが、アプリのロジックに問題があります。どんな助けでも大歓迎です。

アプリの目標:入力したすべての略語を次の方法で単語にデコード(置換)します。-ユーザーがテキストボックスを介してテキストを入力します-アプリは略語を探し(いくつか)、略語をテキストのみに置き換えます。

私はそれをいくつかの省略形で行うことができましたが、私の場合、すべての省略形は入力テキストに含まれている必要があります。そうでない場合は機能しません。うまくいかなかったいくつかの方法を試しました。abvと対応するテキストに2つのリストを使用しています。

これがコードです。

List<String> coded = ["GM", "HOT", "YAH"]; //ABV list
List<String> decoded = ["Gmail", "Hotmail", "Yahoo"]; //corresponding list 
Map<String, String> map = new Map.fromIterables(coded, decoded);

String txt = "HOT was the best until GM took over"; //input text

void main() {
  if ((txt.contains(coded[0]))) { //GM
    String result = txt.replaceAll(coded[0], decoded[0]); //Replace with Gmail

    print(result);
  }
  else if ((txt.contains(coded[0])) && (txt.contains(coded[1]))) {
    String result = (txt.replaceAll(coded[0], decoded[0]));
    (txt.replaceAll(coded[1], decoded[1]));

    print(result);
  }
  else if ((txt.contains(coded[0])) && (txt.contains(coded[1])) && (txt.contains(coded[2]))) {
    String result = txt.replaceAll(coded[0], decoded[0]);
    txt.replaceAll(coded[1], decoded[1]);
    txt.replaceAll(coded[2], decoded[2]);

    print(result);
  }
  else {
    print(txt);
  }
} 
4
M. Romaithi

fold を使用すると、必要な操作を簡単に行うことができます。

List<String> coded = ["GM", "HOT", "YAH"]; //ABV list
List<String> decoded = ["Gmail", "Hotmail", "Yahoo"]; //corresponding list 
Map<String, String> map = new Map.fromIterables(coded, decoded);

String txt = "HOT was the best until GM took over"; //input text

void main() {
  final result = map.entries
    .fold(txt, (prev, e) => prev.replaceAll(e.key, e.value));
  print(result);
}

基本的には、マップエントリ(キー/値のペア)を反復処理します。 foldは、初期値(あなたの場合はtxt)と、反復される現在の要素で以前の値を更新する関数を取ります。各反復の後、結果はすべてのABVを置き換えました。

2

質問のタイトルに基づいてここに来る他の人には、replaceAllを使用します。

final original = 'Hello World';
final find = 'World';
final replaceWith = 'Home';
final newString = original.replaceAll(find, replaceWith);
// Hello Home
0
Suragch