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
相关产品推荐
相关产品推荐

