【问题标题】:How do I split a token from the end of my string?如何从字符串末尾拆分令牌?
【发布时间】:2017-12-22 05:29:54
【问题描述】:

如果在字符串末尾找到来自数组的标记,我想将字符串分成两部分。我试过这个:

x = "Canton Female"
GENDER_TOKENS = ["m", "male", "men", "f", "w", "female", "wom"]

x.partition(/(^|[[:space:]]+)[#{Regexp.union(GENDER_TOKENS)}]$/i)
 #=> ["Canton Female", "", ""]

但是,虽然“女性”这个词是我标记的一部分,但它并没有被分开。如何调整我的正则表达式以使其正确拆分?

【问题讨论】:

  • 你想返回什么值?
  • 您犯了同样的错误:您在正则表达式文字中使用 Regexp.union 并且 i 不会影响这些交替。另外,你把这个组放到一个字符类中,它完全破坏了这个模式。不知道你需要什么,见this demo,试试x.partition(/(?:^|[[:space:]]+)(?:#{Regexp.union(GENDER_TOKENS).source})$/i)

标签: ruby regex string split ruby-2.4


【解决方案1】:

有点不清楚你在问什么 - 想要的结果是什么?但是,这就是我认为您正在寻找的内容:

GENDER_TOKENS = ["m", "male", "men", "f", "w", "female", "wom"]

"Canton Female".split(/\b(#{Regexp.union(GENDER_TOKENS).source})$/i)
#=> => ["Canton ", "Female"]

"Tom Lord".split(/\b(#{Regexp.union(GENDER_TOKENS).source})$/i)
#=> => ["Tom Lord"]
  • String#split 将在每次匹配时拆分字符串;不像String#partition,它返回[head, match, tail]。我认为这可能就是你想要的?
  • \b 是一个词边界锚。与尝试匹配“行首或空白”相比,这是一种更简洁的解决方案。
  • Regexp 联合被包裹在 round 括号中以将值组合在一起,而不是方括号。后者使它成为一个字符集,这显然不是你想要的。
  • Regexp#source 只返回正则表达式的内部“文本”;与您使用的(隐式)Regexp#to_s 不同,它返回包含选项切换的完整对象 - 即/(?-mix:m|male|men|f|w|female|wom)/

【讨论】:

  • 值得注意的是,原始示例在 [...] 括号(字符集)中包含 Regexp.union 部分,这使其行为完全不同。
【解决方案2】:

为什么不先拆分呢?

parts = x.split
if GENDER_TOKENS.include? parts.last.downcase
  # ...
end

可能不会慢很多,而且可读性更好

【讨论】:

    【解决方案3】:
    GENDER_TOKENS = %w[m male men f w female wom]
    GENDER_REGEX = /\b(?:#{GENDER_TOKENS.join('|')})\z/i
      #=> /\b(?:m|male|men|f|w|female|wom)\z/i
    
    def split_off_token(str)
      idx = str =~ GENDER_REGEX
      case idx
      when nil
        [str]
      when 0
        ['', str]
      else
        [str[0, idx].rstrip, str[idx..-1]]
      end
    end
    
    split_off_token("Canton Female")
      #=> ["Canton", "Female"]
    split_off_token("Canton M")
      #=> ["Canton", "M"]
    split_off_token("wom")
      #=> ["", "wom"]
    split_off_token("Canton Fella")
      #=> ["Canton Fella"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2015-10-09
      • 2010-11-05
      相关资源
      最近更新 更多