繁体   English   中英

如何从字符串末尾拆分令牌?

[英]How do I split a token from the end of my string?

如果要在字符串的末尾找到数组中的标记,我想将字符串分为两部分。 我已经试过了:

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

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

但是,尽管“女性”一词是我的记号的一部分,但它并没有分裂。 如何调整我的正则表达式,使其正确分割?

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

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#source仅返回Regexp#source的内部“文本”。 与您所使用的(隐式) Regexp#to_s不同,它返回包含选项切换的完整对象,即/(?-mix:m|male|men|f|w|female|wom)/

为什么不先分裂?

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

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

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"]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM