【问题标题】:ruby regex extract word between single quotesruby regex 提取单引号之间的单词
【发布时间】:2016-08-21 03:02:55
【问题描述】:

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

ciao: c'iao 'ciao'

与:

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

到目前为止,我已经能够满足前 2 个要求:

/[\w']+/

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

我看过很多类似的问答,但没有找到适合我需要的;包含简要说明的答案的加分:)

【问题讨论】:

标签: ruby regex


【解决方案1】:

您可以使用以下表达式:

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

Rubular demo

表达式匹配:

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

short Ruby demo here

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

【讨论】:

    【解决方案2】:

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

    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 中以单引号开头和结尾的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2022-11-30
      • 1970-01-01
      相关资源
      最近更新 更多