プログラム学習室 http://studyhallweb.com/

Dart 文字列の処理

数字から文字に変換

toString() を使う
_toString(num n) {
  String s = n.toString();
  print(s);
}				

数字から文字列(前ゼロ)

padLeft() を使う
_zeroPadding(num n, int m) {
  String s = n.toString().padLeft(m, '0');
  print(s);
}				

文字列から数字に変換

int であれば、int.parse()、 doouble は double.parse() を使う
次の例では正規表現を使って事前に文字列が数字に変換可能であるか確認している(桁をあらわすカンマには対応していない)
class conv {
  int i;
  double d;
  int type;    // 0=int, 1=double, -1=String
  String _s;

  conv([_s]) {
    if (_s != null) toNum(_s);
  }

  toNum(_s) {
    RegExp exp = new RegExp(r'-?[0-9]+.?[0-9]*');
    if (_s == exp.stringMatch(_s)) {
      d = double.parse(_s);
      if (_s.indexOf('.') == -1) {
        // 小数点なし
        i = int.parse(_s);
        type = 0;
      } else {
        // 小数点が含まれている場合、四捨五入
        i = d.round();
        type = 1;
      }
    } else {
      type = -1;
    }
  }
}

void main(){
  conv no = new conv('-1.67');

  print(no.i);
  print(no.d);
	print(no.type);
}				

実行結果
-2
-1.67
1
				

文字列の一部抽出

String substring(int startIndex, [int endIndex]) を使う
startIndex は 0 からの Index番号、endIndex は初めから何番目になるので注意
すなわち、初めの1文字だけを抽出するときは substring(0, 1) になる
_substring() {
  print('■ 文字列の一部抽出');
  print('初めの位置は index番号(0から)、終わりの位置は"何番目"');
  String s = '123456789'.substring(2, 5);
  print("'123456789'.substring(2, 5) = $s");

  assert('123456789'.substring(0, 1) == '1');
  assert('123456789'.substring(0, 3) == '123');
  assert('123456789'.substring(6, '123456789'.length) == '789');

  String s1,s2;
  s1 = 'http://studyhall.webcrow.jp/';
  s2 = 'http://studyhall.webcrow.jp/dart/index.html';
  assert(s2.substring(s1.length, s2.length) == 'dart/index.html');
}				

実行結果
■ 文字列の一部抽出
初めの位置は index番号(0から)、終わりの位置は"何番目"
'123456789'.substring(2, 5) = 345
				

ある文字やパターンの出現位置

int indexOf(Pattern pattern, [int start]) でindex番号を取得
lastIndexOf() は最後に現れる位置
_indexOf() {
  String s1;
  s1 = 'http://studyhall.webcrow.jp/';
  // 初めの位置
  assert(s1.indexOf('//') == 5);
  // 最後の位置
  assert(s1.lastIndexOf('/') == s1.length - 1);
  // 指定の位置以降で初めて現れるの位置
  assert(s1.indexOf('/', 'http://'.length) == s1.length - 1);
  // ある文字の前までの抜き取り
  assert('index.html'.substring(0, 'index.html'.indexOf('.')) == 'index');
}				

substring と indexOf の組み合わせ

substring と indexOf を組み合わせて使うことで色々な文字列の処理が可能になる
_url() {
  // 応用:URLリンク
  String sURL = 'http://homepage/dart/lib';
  sURL = sURL.substring(0, sURL.lastIndexOf('/'));
  assert(sURL == 'http://homepage/dart');
  String sLink = '../bin/string.html';
  sURL += sLink.substring('..'.length, sLink.length);
  assert(sURL == 'http://homepage/dart/bin/string.html');
}
				

文字列の置き換え

replace系のメソッドを使用する
_replace() {
  // c:\\ を http:// にして、全ての \\ を / に置き換える
  assert(('c:\\temp\\test\\index.html'.replaceFirst('c:\\', 'http://')).replaceAll('\\', '/')
      == 'http://temp/test/index.html');
}				

正規表現

RegExpクラスを使用することにより正規表現が使える
RegExpクラスで正規表現のパターンを設定してインスタンス化し、検索対処の文字列にメソッドを適用する
page018_01.txt

実行結果
page018_01a.txt

検索結果は Match型で返される。 Match は配列になっており、[0]はヒットしたすべて、[1],[2],,[n]は正規表現にて()で指定したバターングループがそれぞれ入る。

検索のメソッドして、firstMatch()、allMatches()、matchAsPrefix()の3つがある。
firstMatch()は正規表現が該当する初めのパターン、allMatches()はすべてのパターン、matchAsPrefix()は検索開始位置を指定できる。
firstMatch()とmatchAsPrefis()は、Matchが単体で返されるが、allMatches()は複数のため戻り値はイテレータとなる。
page018_02.txt

matchAsPrefix()は第二引数で検索開始位置を指定している。この開始位置から正規表現にヒットしないとエラーになる。

実行結果
page018_02a.txt

上記の例のallMatches()は、正規表現をグループ化していないためgroup(0)だけとなり、実質for(Match)のループのみとなる。

文字列の配列から特性の文字を含む文字列を抽出する

ある文字を含んでいるかの判定は bool contains(Object element) を使用
どこにあるか探すためには firstWhere(Function test, {Function orElse}) を使用する
ただし、firstWhere は文字列の配列に適用した場合、index番号ではなく、配列要素の文字列そのものが返ってくるので注意
_contains() {
  print('■ 文字列の配列の中から<title>を含む要素を抜き取る');
  List<String> html = ['<head>','<meta charset="utf-8">','<title>Test</title>','</head>'];
  String s;
  for (int i = 0; i < html.length; i++) {
    s = html[i];
    print('$i:$s');
  }
  s= html.firstWhere((x) => x.contains('<title>'));
      // <title> を含む html の文字列そのものが 戻り値になる
  int n = html.indexOf(s);  // 配列のindexを取得する
  print('<title>を含むのは$n番の$s');
}				

上記ソースの実行結果
■ 文字列の配列の中から<title>を含む要素を抜き取る
0:<head>
1:<meta charset="utf-8">
2:<title>Test</title>
3:</head>
<title>を含むのは2番の<title>Test</title>