You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 23:27:02