Julia技术问题:如何在含标点的字符串中找出最长单词?
解决Julia中提取带标点字符串最长单词的问题
嘿,作为Julia新手碰到这个问题太正常了,我来帮你捋清楚问题出在哪,再给你靠谱的解法!
首先先拆解你现有代码的问题:
split(sen, "")是把字符串拆成单个字符,maximum(length(split(sen, "")))其实算的是整个字符串的字符总数,完全不是单词长度,这一步逻辑跑偏了;split(sen, " ")按空格拆分的话,会把带标点的内容(比如Hello,、punctuation?)当成完整单词,这样计算的长度会包含标点,不符合你要的“获取真正单词”的需求;- 最后你只是返回了所有单词和长度的列表,没有筛选出最长的那个。
正确的解法思路
核心是先正确提取出不带标点的单词,再从中找出最长的。我们可以用正则表达式来匹配所有纯单词字符,自动跳过标点符号。
这里给出实现代码:
function longest_word(sen::String) # 用正则匹配所有单词(字母、数字组成,自动跳过标点) # 如果需要支持连字符单词,可以把正则改成 r"[\w-]+" word_matches = eachmatch(r"\w+", sen) # 把匹配结果转换成纯单词数组 words = [match_result.match for match_result in word_matches] # 处理空字符串的边界情况 isempty(words) && return "" # 找出长度最长的单词,若有多个长度相同的,返回第一个出现的 return maximum(words, by = length) end # 测试你的示例句子 println(longest_word("Hello, how are you? nested, punctuation?")) # 输出: punctuation
代码细节解释
- 正则提取单词:
r"\w+"是正则表达式,匹配一个或多个单词字符(字母、数字、下划线,如果你想排除下划线,可以改成r"[a-zA-Z0-9]+"),eachmatch会遍历整个字符串,找出所有符合的匹配项; - 转换为单词数组:把每个匹配结果的
match属性提取出来,得到纯单词的数组; - 边界处理:如果输入字符串没有任何单词(比如全是标点),返回空字符串避免报错;
- 找出最长单词:
maximum函数的by参数指定用length(单词长度)作为比较依据,直接返回最长的单词。
这样就能完美处理带标点的情况啦!
内容的提问来源于stack exchange,提问作者flavinsky
相关产品推荐
相关产品推荐

