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

如何检测字符串中所有字母均为大写?(用于数据集章节标题筛选)

解决大写章节标题的筛选问题

你的问题出在正则表达式的范围限定上——原正则只匹配连续的大写字母,但目标标题里包含空格和撇号,自然匹配失败啦。咱们一步步调整:

问题分析

原代码里的^[[:upper:]]{2,}+$有两个明显问题:

  • 只允许纯大写字母,没包含标题里常见的空格和撇号(比如THE QUEEN'S HAND里的空格和')
  • {2,}+是冗余写法,{2,}已经表示“至少2个字符”

正确的正则表达式

根据你的需求(长度≥2、仅含大写字母/撇号/空格,排除特殊符号),正确的正则应该是:

^[[:upper:] ']{2,}$

拆解一下规则:

  • ^ 和 $:锁定字符串的开头和结尾,确保整个内容都符合规则,不会出现“部分符合但带特殊符号”的漏网之鱼
  • [[:upper:] ']:允许的字符集合——大写字母、空格、半角撇号(如果你的数据里有全角撇号’,就改成[[:upper:] '’],兼容两种写法)
  • {2,}:要求字符串总长度至少为2,直接排除单个I这类非章节内容

测试验证

咱们用你的例子逐一测试:

library(stringr)

# 符合要求的匹配成功案例
str_detect("ARYA", "^[[:upper:] ']{2,}$")          # 返回 TRUE
str_detect("THE QUEEN'S HAND", "^[[:upper:] ']{2,}$") # 返回 TRUE

# 需要排除的匹配失败案例
str_detect("I", "^[[:upper:] ']{2,}$")             # 返回 FALSE(长度不足)
str_detect("STOP THIS!", "^[[:upper:] ']{2,}$")    # 返回 FALSE(含感叹号)
str_detect("Hello World", "^[[:upper:] ']{2,}$")   # 返回 FALSE(有小写字母)

结合dplyr批量筛选数据集

如果要在数据集中批量筛选目标章节标题,直接把正则放进filter函数即可:

library(dplyr)
library(stringr)

# 假设你的数据集是df,目标列名为chapter_title
filtered_df <- df %>%
  filter(str_detect(chapter_title, "^[[:upper:] ']{2,}$"))

额外说明

如果你的需求里真的不允许空格(但和你给出的例子矛盾),只需要把正则里的空格去掉,改成^[[:upper:]']{2,}$就行——不过这样THE QUEEN'S HAND会被排除,建议根据实际数据调整字符集合。

内容的提问来源于stack exchange,提问作者Evan O.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:37:10