如何使用正则表达式将字符串拆分为单词、标点、空格并正确处理撇号
正则拆分方案
实现代码
你可以使用以下通用正则实现需求,以Dart为例写法如下:
final result = RegExp(r"(?:\w(?:'\w)*)+|\s+|[^\w\s]") .allMatches(inputString) .map((match) => match.group(0)) .toList();
正则逻辑说明
- 第一部分
(?:\w(?:'\w)*)+:匹配合法带撇号的单词,仅当撇号出现在两个单词字符中间时才会被纳入单词范围,可正确匹配you're、I'm、didn't这类场景,同时规避了首尾撇号被误算进单词的问题 - 第二部分
\s+:匹配连续的任意长度空格,符合连续空格作为单个元素的要求 - 第三部分
[^\w\s]:匹配所有非单词、非空格的字符,即全部标点符号,无需手动枚举标点,具备全场景通用性
测试验证
以你给出的示例输入测试:
输入字符串:"One day you're going to 'solve' this problem"
输出结果:["One", " ","day"," ","you're"," ","going"," ","to"," ","'","solve","'"," ","this","problem"]
完全符合预期。
内容的提问来源于stack exchange,提问作者Mijawel
相关产品推荐
相关产品推荐

