如何用正则表达式匹配首字母按字母表相邻的两个单词?
解决方案
正则表达式本身无法直接进行字符的数值比较(比如判断首字母ASCII值是否相邻),所以需要结合R的字符串处理功能,先提取所有相邻单词对,再过滤出符合条件的结果。
实现代码
library(stringr) sentences <- c("She likes butter chicken.", "He loves mango.", "Lara makes nuggets.", "We want help.") # 提取所有相邻的完整单词对 word_pairs <- str_extract_all(sentences, "\\b\\w+\\s+\\w+\\b") # 过滤首字母按A→Z顺序相邻的单词对 filter_adjacent_pairs <- function(pairs) { if (length(pairs) == 0) return(character(0)) # 拆分每个单词对为两个独立单词 split_pairs <- str_split(pairs, "\\s+") # 提取首字母并统一转为小写 first_chars <- lapply(split_pairs, function(x) str_to_lower(str_sub(x, 1, 1))) # 将首字母转为ASCII码值 ascii_vals <- lapply(first_chars, function(x) utf8ToInt(x)) # 判断后一个首字母的ASCII码是否恰好比前一个大1(满足A→Z相邻顺序) valid <- sapply(ascii_vals, function(x) x[2] == x[1] + 1) pairs[valid] } # 对所有句子的单词对应用过滤规则 result <- lapply(word_pairs, filter_adjacent_pairs) print(result)
代码说明
\\b\\w+\\s+\\w+\\b:匹配所有由单个空格分隔的完整相邻单词对,确保匹配的是独立单词而非单词片段。- 过滤函数逻辑:
- 拆分每个单词对为两个独立单词;
- 统一首字母大小写,避免大小写差异影响判断;
- 将首字母转为ASCII码值,通过数值比较判断是否相邻;
- 返回符合A→Z顺序相邻条件的单词对。
运行结果
[[1]] [1] "butter chicken" [[2]] [1] "loves mango" [[3]] [1] "makes nuggets" [[4]] character(0)
结果完全符合预期需求。
内容的提问来源于stack exchange,提问作者Grasshopper_NZ
相关产品推荐
相关产品推荐

