Spasi kosong Dart RegExp tidak dikenali

Aug 19 2020

Saya mencoba menerapkan pola regex untuk nama pengguna yang memungkinkan huruf bahasa Inggris, huruf Arab, angka, tanda hubung, dan spasi.

Pola berikut selalu mengembalikan tidak ada kecocokan jika string masukan memiliki spasi meskipun \ s disertakan dalam pola

Pattern _usernamePattern = r'^[a-zA-Z0-9\u0621-\u064A\-\s]{3,30}$';

Saya juga mencoba mengganti \ s dengan "" dan \\ s tetapi regex selalu mengembalikan tidak ada kecocokan untuk masukan yang memiliki spasi di dalamnya.

Sunting: Ternyata flutter menambahkan karakter unicode untuk "Tanda Kanan-Ke-Kiri" atau "Tanda Kiri-Ke-Kanan" saat menggunakan bidang teks dengan campuran bahasa yang menggunakan LTR atau RTL. Tanda tambahan ini adalah karakter unicode yang ditambahkan ke teks. Regex di atas gagal karena karakter tambahan ini. Untuk mengatasi masalah cukup lakukan replaceAll untuk karakter ini. Baca lebih lanjut di sini:https://github.com/flutter/flutter/issues/56514.

Jawaban

2 wp78de Aug 20 2020 at 03:34

Ini adalah masalah yang cukup buruk dan perlu didokumentasikan sebagai jawaban di sini.

Seperti yang didokumentasikan dalam sumber :

  /// When LTR text is entered into an RTL field, or RTL text is entered into an
  /// LTR field, [LRM](https://en.wikipedia.org/wiki/Left-to-right_mark) or
  /// [RLM](https://en.wikipedia.org/wiki/Right-to-left_mark) characters will be
  /// inserted alongside whitespace characters, respectively. This is to
  /// eliminate ambiguous directionality in whitespace and ensure proper caret
  /// placement. These characters will affect the length of the string and may
  /// need to be parsed out when doing things like string comparison with other
  /// text.

Meskipun ini dimaksudkan dengan baik, ini dapat menyebabkan masalah ketika Anda bekerja dengan pola teks LTR / RTL campuran (seperti yang terjadi di sini) dan harus memastikan panjang bidang yang tepat, dll.

The menyarankan solusi adalah untuk menghapus semua kiri-kanan-tanda :

void main() {
  final String lrm = 'aaaa \u{200e}bbbb';
  print('lrm: "$lrm" with length ${lrm.length}');
  
  final String lrmFree = lrm.replaceAll(RegExp(r'\u{200e}', unicode: true), '');
  print('lrmFree: "$lrmFree" with length ${lrmFree.length}');
}

Terkait: kanan-ke-kiri (RTL) dalam flutter