如何 select 字符串中特定符号后的 3 个字符
How do I select 3 character in a string after a specific symbol
好的,让我解释一下。我有一些这样的字符串:“BAHDGF - ZZZGH1237484”或
像这个“HDG54 - ZZZ1HDGET4”我想在这里 select 三重 Z(这显然是 3 个不同的字符,但对于这个例子,我认为它对你来说更容易理解)。
所以,我的问题是下一个:第一部分有一个可调节的长度,但我可以忽略它,我需要一些东西来采用三重 Z 所以我在考虑可以在之后“切片”我的字符串的东西
" - ".
我开始尝试使用“分区”,但遗憾地失败了。我只是有点迷失了新闻 3 数组,然后取其中一个数组的前 3 个字母,好吧,它看起来很复杂,我想我只是路过一个我实际上找不到的明显解决方案。我已经用了 2 天了,脑子里没有任何可以帮助我的东西,实际上有点空白页综合症,我真的需要一点帮助来解决这个问题。
鉴于:
examples=[ "BAHDGF - ZZZGH1237484", "HDG54 - ZZZ1HDGET4" ]
您可以使用正则表达式:
examples.each {|e| p e, e[/(?<=-\s)ZZZ/]}
打印:
"BAHDGF - ZZZGH1237484"
"ZZZ"
"HDG54 - ZZZ1HDGET4"
"ZZZ"
或 .split
使用正则表达式:
examples.each {|e| p e.split(/-\s*(ZZZ)/)[1] }
'ZZZ'
'ZZZ'
如果这 3 个字符不是 'ZZZ'
,只需修改您的正则表达式:
> "BAHDGF - ABCGH1237484".split(/\s*-\s*([A-Z]{3})/)[1]
=> "ABC"
如果您想使用.partition
,则需要两步。使用正则表达式分区最简单,然后只取前三个字符:
> "BAHDGF - ABCGH1237484".partition(/\s*-\s*/)[2][0..2]
=> "ABC"
“选择”字符串 "ZZZ"
是用词不当。您要求的是确定字符串是否包含子字符串 "- ZZZ"
,如果包含,则 return "ZZZ"
:
"BAHDGF - ZZZGH1237484".include?("- ZZZ") && "ZZZ"
#=> "ZZZ"
"BAHDGF - ZZVGH1237484".include?("- ZZZ") && "ZZZ"
#=> false
这与仅询问字符串是否包含子字符串 "- ZZZ"
:
几乎没有什么不同
if "BAHDGF - ZZZGH1237484".include?("- ZZZ")
...
end
如果问题是 return "- "
后面的三个相同大写字母组成的字符串,如果存在,您将 选择 子串。可以按如下方式完成。
r = /- \K(\p{Lu}){2}/
"BAHDGF - XXXGH1237484"[r]
#=> "XXX"
"BAHDGF - xxxGH1237484"[r]
#=> nil
正则表达式为“匹配'-',然后忘记到目前为止匹配的所有内容并将匹配指针重置为当前位置(\K
),然后匹配大写Unicode字母(\p{Lu}
) 并保存到捕获组 1 ((\p{Lu})
),然后匹配捕获组 1 (</code>) 的内容两次 (<code>{2}
)"。也可以使用 positive lookbehind:
/(?<=- )(\p{Lu}){2}/
好的,让我解释一下。我有一些这样的字符串:“BAHDGF - ZZZGH1237484”或 像这个“HDG54 - ZZZ1HDGET4”我想在这里 select 三重 Z(这显然是 3 个不同的字符,但对于这个例子,我认为它对你来说更容易理解)。
所以,我的问题是下一个:第一部分有一个可调节的长度,但我可以忽略它,我需要一些东西来采用三重 Z 所以我在考虑可以在之后“切片”我的字符串的东西 " - ".
我开始尝试使用“分区”,但遗憾地失败了。我只是有点迷失了新闻 3 数组,然后取其中一个数组的前 3 个字母,好吧,它看起来很复杂,我想我只是路过一个我实际上找不到的明显解决方案。我已经用了 2 天了,脑子里没有任何可以帮助我的东西,实际上有点空白页综合症,我真的需要一点帮助来解决这个问题。
鉴于:
examples=[ "BAHDGF - ZZZGH1237484", "HDG54 - ZZZ1HDGET4" ]
您可以使用正则表达式:
examples.each {|e| p e, e[/(?<=-\s)ZZZ/]}
打印:
"BAHDGF - ZZZGH1237484"
"ZZZ"
"HDG54 - ZZZ1HDGET4"
"ZZZ"
或 .split
使用正则表达式:
examples.each {|e| p e.split(/-\s*(ZZZ)/)[1] }
'ZZZ'
'ZZZ'
如果这 3 个字符不是 'ZZZ'
,只需修改您的正则表达式:
> "BAHDGF - ABCGH1237484".split(/\s*-\s*([A-Z]{3})/)[1]
=> "ABC"
如果您想使用.partition
,则需要两步。使用正则表达式分区最简单,然后只取前三个字符:
> "BAHDGF - ABCGH1237484".partition(/\s*-\s*/)[2][0..2]
=> "ABC"
“选择”字符串 "ZZZ"
是用词不当。您要求的是确定字符串是否包含子字符串 "- ZZZ"
,如果包含,则 return "ZZZ"
:
"BAHDGF - ZZZGH1237484".include?("- ZZZ") && "ZZZ"
#=> "ZZZ"
"BAHDGF - ZZVGH1237484".include?("- ZZZ") && "ZZZ"
#=> false
这与仅询问字符串是否包含子字符串 "- ZZZ"
:
if "BAHDGF - ZZZGH1237484".include?("- ZZZ")
...
end
如果问题是 return "- "
后面的三个相同大写字母组成的字符串,如果存在,您将 选择 子串。可以按如下方式完成。
r = /- \K(\p{Lu}){2}/
"BAHDGF - XXXGH1237484"[r]
#=> "XXX"
"BAHDGF - xxxGH1237484"[r]
#=> nil
正则表达式为“匹配'-',然后忘记到目前为止匹配的所有内容并将匹配指针重置为当前位置(\K
),然后匹配大写Unicode字母(\p{Lu}
) 并保存到捕获组 1 ((\p{Lu})
),然后匹配捕获组 1 (</code>) 的内容两次 (<code>{2}
)"。也可以使用 positive lookbehind:
/(?<=- )(\p{Lu}){2}/