正则表达式在字符串Ruby的开头捕获某些单词

时间:2017-01-02 07:48:06

标签: ruby regex

寻找有关编写正则表达式的帮助,以捕获特定字符串是否以某些字符串开头并捕获开始和剩余字符串。例如 假设字符串可能的开头是'P','RO','RPX',样本字符串是'PIXR'或'ROXP'或'RPX'。 我正在寻找一个正则表达式,它捕获字符串的开始和结尾部分,如果它以给定的可能字符串开头,例如 'PIXRT'=〜//输出'P'和'IXRT'

不熟悉正则表达式,所以我们非常感谢任何帮助。

2 个答案:

答案 0 :(得分:5)

您可以使用具有2个捕获组的正则表达式,一个捕获组在开始时捕获已知值,其余的将捕获字符串的其余部分:

rx = /\A(RPX|RO|P)(.*)/m
"PIXRT".scan(rx)
# => [P, IXRT]

请参阅Ruby demo

<强>详情:

  • \A - 字符串开头
  • (RPX|RO|P) - 必须在字符串开头的值之一(请注意这些替代品的顺序:较长的值首先出现!)
  • (.*) - 字符串末尾的任何0 +字符(m修饰符也会使.匹配换行符。)

答案 1 :(得分:1)

def split_after_start_string(str, *start_strings)
  a = str.split(/(?<=\A#{start_strings.join('|')})/)
  if a.size == 2
    a
  elsif start_strings.include?(str)
    a << ''
  else
    nil
  end
end

start_strings = %w| P RO RPX |                    #=> ["P", "RO", "RPX"]

split_after_start_string('PIXR', *start_strings)  #=> ["P", "IXR"] 
split_after_start_string('IPXR', *start_strings)  #=> nil 
split_after_start_string('ROXP', *start_strings)  #=> ["RO", "XP"] 
split_after_start_string('RPX',  *start_strings)  #=> ["RPX", ""] 

正则表达式读取,“在正面看后面的字符串开头匹配start_stringx的一个元素”。对于示例中的smart_strings,正则表达式为:

/(?<=\A#{start_strings.join('|')})/               #=> /(?<=\AP|RO|RPX)/