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

Java正则表达式:按空格及标点分割字符串但保留撇号与连字符

解决方案:保留撇号与连字符的字符串分割正则表达式

好问题!要实现按所有标点符号和空格分割字符串,但保留单词内部正确使用的撇号(比如don't)和连字符(比如mother-in-law),可以用正则表达式配合Python的re.split()方法来搞定。

核心正则表达式

r'[^a-zA-Z0-9\'-]|\s'

完整代码示例

import re

# 测试文本
sample_text = "Hello, world! Don't forget about mother-in-law; she's awesome.   Let's test---this."

# 分割字符串
split_result = re.split(r'[^a-zA-Z0-9\'-]|\s', sample_text)
# 过滤分割后产生的空字符串(处理连续分隔符的情况)
cleaned_result = list(filter(None, split_result))

print(cleaned_result)
# 输出: ['Hello', 'world', "Don't", 'forget', 'about', 'mother-in-law', "she's", 'awesome', "Let's", 'test', 'this']

正则表达式解释

我们的正则表达式分成两部分,用|(或)连接:

  • [^a-zA-Z0-9\'-]:匹配任何不是字母、数字、撇号(')或连字符(-)的字符——这些就是我们要作为分隔符的标点符号。
  • \s:匹配任何空白字符(包括空格、制表符、换行符等),实现按空格分割的需求。

为什么要过滤空字符串?

当遇到连续的分隔符(比如多个空格连在一起,或者标点+空格的组合)时,re.split()会生成空字符串元素。用filter(None, ...)可以把这些无用的空字符串过滤掉,得到干净的单词列表。

额外说明

如果你不需要保留下划线(因为\w默认包含下划线,而我们上面用的是a-zA-Z0-9),这个正则已经满足需求;如果你的场景需要支持其他语言的字符(比如中文),可以把a-zA-Z0-9替换成\p{L}\p{N}(需要在正则里加上re.UNICODE或re.U标志),不过这取决于你的具体使用场景。

内容的提问来源于stack exchange,提问作者Jeffrey Lin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:15:10