使用扫描方法+正则表达式将字符串分解为单词,如果单词有`'`字符,则删除该字符及其后面的所有内容

Posted

技术标签:

【中文标题】使用扫描方法+正则表达式将字符串分解为单词,如果单词有`\'`字符,则删除该字符及其后面的所有内容【英文标题】:Break string into words using scan method + regexp, if word has `'` character, drop this character and everything after it使用扫描方法+正则表达式将字符串分解为单词,如果单词有`'`字符,则删除该字符及其后面的所有内容 【发布时间】:2021-12-02 04:20:06 【问题描述】:
sample_string = "let's could've they'll you're won't"
sample_string.scan(/\w+/)

上面给了我:

["let", "s", "could", "ve", "they", "ll", "you", "re", "won", "t"]

我想要什么:

["let", "could", "they", "you", "won"]

一直在https://rubular.com/ 中玩耍并尝试像\w+(?<=') 这样的断言,但没有运气。

【问题讨论】:

一个小点:一些英文单词,例如“shoudn't've”有double apostrophes。有些甚至有triple contractions。我想你不关心处理这些。 感谢您提出这一点,您的假设是正确的。如果我必须处理双/三撇号,而不是删除字符,我不妨扩展它们以获得没有撇号的单词。 【参考方案1】:

你可以使用

sample_string.scan(/(?<![\w'])\w+/)
sample_string.scan(/\b(?<!')\w+/)

请参阅Rubular demo。模式(它们是绝对同义词)匹配

(?&lt;![\w']) - 字符串中不紧跟单词或' char 的位置 \b(?&lt;!') - 一个字边界位置,前面没有紧跟 ' 字符 \w+ - 一个或多个单词字符。

见Ruby demo:

sample_string = "let's could've they'll you're won't"
p sample_string.scan(/(?<![\w'])\w+/)
# => ["let", "could", "they", "you", "won"]

【讨论】:

【参考方案2】:

给定:

> sample_string = "let's could've they'll you're won't"

你可以做拆分和映射:

> sample_string.split.map|w| w.split(/'/)[0]
=> ["let", "could", "they", "you", "won"]

【讨论】:

以上是关于使用扫描方法+正则表达式将字符串分解为单词,如果单词有`'`字符,则删除该字符及其后面的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

Python 正则表达式将空格分隔的单词分隔成一个列表

Java 常用对象-Scanner类

ACM之反转字符串里的单词

如何将参数传递给正则表达式构造函数,并在 String.matchAll 方法中使用 [重复]

如何使用 java 正则表达式验证字符串?

正则表达式匹配一定长度的单词