【问题标题】:How do I select 3 character in a string after a specific symbol如何在特定符号后选择字符串中的 3 个字符
【发布时间】:2021-06-16 10:16:15
【问题描述】:

好的,让我解释一下。我有一些这样的字符串:“BAHDGF - ZZZGH1237484”或 像这样“HDG54 - ZZZ1HDGET4”我想在这里选择三重 Z(这显然是 3 个不同的字符,但对于这个例子,我认为它对你来说更容易理解)。

所以,我的问题是下一个:第一部分的长度是可调节的,但我可以忽略它,我需要一些东西来获取三重 Z,所以我在想一些东西可以在之后“切片”我的字符串 “-”。

我开始尝试使用“分区”,但可惜失败了。我只是对新闻 3 数组有点迷失,然后取其中一个数组的前 3 个字母,嗯,这似乎很复杂,我想我只是通过一个我实际上找不到的明显解决方案。我已经有 2 天的时间了,我脑子里没有任何可以帮助我的东西,实际上是一种空白页综合症,我真的需要一点帮助来解开这一点。

【问题讨论】:

  • 我不使用 ruby​​ 但regular expressions exist in ruby。希望有人来帮助您实现它,但这将帮助您解决它。捕获这三个字符.*?\s-\s(.{3}) 的工作模式(您可以测试here)。您想要的是与该模式匹配的第一个(也是唯一一个)捕获组。请注意,以后您也可以只加粗您想要的字符,但您的信息在这里很清楚。

标签: arrays ruby string character variable-length


【解决方案1】:

“选择”字符串"ZZZ" 是用词不当。您要求的是确定字符串是否包含子字符串"- ZZZ",如果包含,则返回"ZZZ"

"BAHDGF - ZZZGH1237484".include?("- ZZZ") && "ZZZ"
  #=> "ZZZ"

"BAHDGF - ZZVGH1237484".include?("- ZZZ") && "ZZZ"
  #=> false

这与只询问字符串是否包含子字符串"- ZZZ" 几乎没有什么不同:

if "BAHDGF - ZZZGH1237484".include?("- ZZZ")
  ...
end 

如果问题是,例如,返回"- " 后面的三个相同大写字母的字符串,如果存在,您将选择 一个子字符串。可以按如下方式完成。

r = /- \K(\p{Lu})\1{2}/

"BAHDGF - XXXGH1237484"[r]
  #=> "XXX"

"BAHDGF - xxxGH1237484"[r]
  #=> nil

正则表达式读取,“匹配'-',然后忘记到目前为止匹配的所有内容并将匹配指针重置为当前位置(\K),然后匹配一个大写的Unicode字母(\p{Lu})并保存捕获组 1 ((\p{Lu})),然后匹配捕获组 1 (\1) 的内容两次 ({2})"。也可以选择使用积极的后视

/(?<=- )(\p{Lu})\1{2}/

【讨论】:

  • 谢谢大家的帮助,对我帮助很大!
【解决方案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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-08
    • 2017-08-08
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    相关资源
    最近更新 更多