Dart RegExp beyaz boşlukları tanınmıyor
Kullanıcı adı için İngilizce harflere, Arap harflerine, rakamlara, tireye ve boşluğa izin veren bir normal ifade kalıbı uygulamaya çalışıyorum.
Aşağıdaki kalıp, kalıba \ s dahil edilmiş olsa bile girdi dizesinde boşluk varsa her zaman eşleşme yok
Pattern _usernamePattern = r'^[a-zA-Z0-9\u0621-\u064A\-\s]{3,30}$';
Ayrıca \ s'yi "" ve \\ s ile değiştirmeyi denedim, ancak normal ifade içinde boşluk olan herhangi bir girdi için her zaman eşleşme döndürmüyor.
Düzenleme: Flutter'ın, LTR veya RTL'ye giden dillerin karışımına sahip bir metin alanını kullanırken "Sağdan Sola İşareti" veya "Soldan Sağa İşareti" için bir unicode karakter eklediği ortaya çıktı. Bu ek işaret, metne eklenen bir unicode karakterdir. Yukarıdaki normal ifade, bu ek karakter nedeniyle başarısız oluyordu. Sorunu çözmek için bu karakterler için bir replaceAll yapın. Daha fazlasını buradan okuyun:https://github.com/flutter/flutter/issues/56514.
Yanıtlar
Bu oldukça çirkin bir sorundur ve burada bir cevapla belgelenmeye değer.
Kaynakta belgelendiği gibi :
/// 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.
Bu iyi tasarlanmış olsa da, karışık LTR / RTL metin desenleriyle (burada olduğu gibi) çalıştığınızda sorunlara neden olabilir ve tam alan uzunluğunu vb. Sağlamanız gerekir.
Önerilen çözüm, tüm kaldırmaktır sol-sağ-işaretleri :
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}');
}
İlgili: çarpıntıda sağdan sola (RTL)