红宝石正则表达式提取单引号之间的单词

时间:2016-08-20 15:15:08

标签: ruby regex

我正在寻找匹配的正则表达式:

ciao: c'iao 'ciao'

使用:

ciao #every word excluding non-word character
c'iao #including apostrophes
ciao #excluding the quotes ''

到目前为止,我已经能够将前两个要求与:

相匹配
/[\w']+/

但我正在努力在单引号之间提取单词(不包括引号)。请注意,我不会在引号之间包含带撇号的单词(例如'c'iao')

我见过许多类似的Q& A,但找不到任何适合我的需求;答案的额外分数包括一个简短的解释:)

2 个答案:

答案 0 :(得分:3)

您可以使用以下表达式:

/\w+(?:'\w+)*/

请参阅Rubular demo

表达式匹配:

  • \w+ - 一个或多个单词字符
  • (?:'\w+)* - 零个或多个序列(因为(?:...)*是一个非捕获组,它将用*量词匹配的0个或更多个匹配量化的子模式序列分组):
    • ' - 撇号
    • \w+ - 一个或多个单词字符。

查看short Ruby demo here

"ciao: c'iao 'ciao'".scan(/\w+(?:'\w+)*/)
# => [ciao, c'iao, ciao]

答案 1 :(得分:0)

考虑到单词可以以撇号开头或结尾,或者包含多个撇号,我建议首先拆分空格,然后删除包含单词的单引号对。

str = "'Twas because Bo didn't like Bess' or y'all's 'attitude'"

str.split.map { |s| s =~ /\A'.+'\z/ ? s[1..-2] : s }
  #=> ["'Twas", "because", "Bo", "didn't", "like", "Bess'", "or", "y'all's", "attitude"]

第一步产生

arr = str.split
  #=> ["'Twas", "because", "Bo", "didn't", "like", "Bess'", "or", "y'all's", "'attitude'"]

正则表达式匹配arr以单引号开头和结尾的元素。