如何实现TextField中句号后首个单词的首字母自动大写?
功能实现方案
这个功能可以实现,核心思路是通过正则匹配句子结束标点(句号、感叹号、问号)加空格后的首个字符,以及文本开头的首个字符,统一替换为大写,同时适配输入过程中的光标位置不异常跳转。
修改后的完整代码
1. 扩展方法新增句首大写逻辑
extension CapExtension on String { String get inCaps => length > 0 ? '${this[0].toUpperCase()}${substring(1)}' : ''; String get capitalizeFirstofEach => replaceAll(RegExp(' +'), ' ') .split(" ") .map((str) => str.inCaps) .join(" "); // 新增句末标点后首字母大写逻辑 String get autoCapitalizeAfterSentence { if (isEmpty) return this; // 正则规则:匹配文本开头,或 .!? 加空格后的首个小写字母 return replaceAllMapped( RegExp(r'(?<=[.!?]\s|^)([a-z])'), (match) => match.group(0)!.toUpperCase(), ); } }
2. 修改输入格式化器
class CapitalCaseTextFormatter extends TextInputFormatter { @override TextEditingValue formatEditUpdate( TextEditingValue oldValue, TextEditingValue newValue) { final formattedText = newValue.text.autoCapitalizeAfterSentence; return TextEditingValue( text: formattedText, // 校准光标位置,避免输入时光标跳转到末尾 selection: newValue.selection.copyWith( baseOffset: newValue.selection.baseOffset.clamp(0, formattedText.length), extentOffset: newValue.selection.extentOffset.clamp(0, formattedText.length), ), ); } }
3. 组件调用方式保持不变
TextFormField( inputFormatters: [ CapitalCaseTextFormatter() ] )
适配说明
如果需要兼容中文标点的场景,只需把正则规则中的[.!?]修改为[.!?。!?],即可支持中文句号、感叹号、问号后的首字母大写需求。
内容的提问来源于stack exchange,提问作者saeid
相关产品推荐
相关产品推荐

