如何从字符串末尾拆分标记?
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", "", ""]
但是虽然 "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
,returns [head, match, tail]
。我认为这可能就是你想要的?
\b
是词边界锚点。这是比尝试在 "start of line or whitespace". 上匹配更简洁的解决方案
- Regexp 联合包含在 round 方括号中以将值组合在一起,而不是方括号。后者使它成为一个字符集,这显然不是你想要的。
Regexp#source
returns 仅正则表达式的内部 "text";与您使用的(隐式)Regexp#to_s
不同,returns 包含选项切换的完整对象 - 即 /(?-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"]
如果在字符串末尾找到数组中的标记,我想将字符串分成两部分。我试过这个:
x = "Canton Female"
GENDER_TOKENS = ["m", "male", "men", "f", "w", "female", "wom"]
x.partition(/(^|[[:space:]]+)[#{Regexp.union(GENDER_TOKENS)}]$/i)
#=> ["Canton Female", "", ""]
但是虽然 "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
,returns[head, match, tail]
。我认为这可能就是你想要的?\b
是词边界锚点。这是比尝试在 "start of line or whitespace". 上匹配更简洁的解决方案
- Regexp 联合包含在 round 方括号中以将值组合在一起,而不是方括号。后者使它成为一个字符集,这显然不是你想要的。
Regexp#source
returns 仅正则表达式的内部 "text";与您使用的(隐式)Regexp#to_s
不同,returns 包含选项切换的完整对象 - 即/(?-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"]