如何用正则捕获组内最多1-2个空格的单词组及数字?
正则表达式调整方案
核心问题分析
你之前的正则出现匹配异常,是因为第一个捕获组([\w\s-]+)属于贪婪匹配,会把后面的大量空格和第二个单词组一并吞入,导致第二个捕获组无法正确捕获目标内容。同时需要明确单词组内最多1-2个空格的规则,避免无限制匹配空格。
调整后的正则表达式
"^([\\w/-]+(?:\\s{1,2}[\\w/-]+)*)(?:\\s{5,}([\\w/-]+(?:\\s{1,2}[\\w/-]+)*))?\\s{5,}([\\d.,]+)$"
各部分规则说明
第一个单词组:
([\w/-]+(?:\s{1,2}[\w/-]+)*)- 匹配由
\w(字母/数字/下划线)、/、-组成的单词 - 单词之间仅允许1-2个空格分隔,确保不会误吞后续的大量分隔空格
- 至少包含1个单词
- 匹配由
可选的第二个单词组:
(?:\s{5,}([\w/-]+(?:\s{1,2}[\w/-]+)*))?\s{5,}:匹配至少5个空格作为两个单词组的分隔符(与示例中的大量空格对应)- 内部的单词组规则和第一个完全一致
- 末尾的
?表示该部分可选(对应第二个单词组不存在的场景)
数字部分:
([\d.,]+)- 匹配包含数字、小数点、逗号的数值内容
边界约束:
^和$确保正则匹配整个字符串,避免部分匹配导致的异常
R语言测试示例
test <- c("word1 word2 word3 word4 1234.23,4", "word1 word2 1946.27,4") library(stringr) str_match(test,"^([\\w/-]+(?:\\s{1,2}[\\w/-]+)*)(?:\\s{5,}([\\w/-]+(?:\\s{1,2}[\\w/-]+)*))?\\s{5,}([\\d.,]+)$")
测试结果
[,1] [,2] [,3] [,4] [1,] "word1 word2 word3 word4 1234.23,4" "word1 word2" "word3 word4" "1234.23,4" [2,] "word1 word2 1946.27,4" "word1 word2" "" "1946.27,4"
内容的提问来源于stack exchange,提问作者denis
相关产品推荐
相关产品推荐

