使用正则表达式仅匹配顺序(但不一定是连续)匹配

时间:2017-10-23 05:08:06

标签: ruby regex string

我试图尽可能长时间地将正则表达式与字符串匹配。这是要查看的字符串:

"xxaxxbxxbxbxxbxxbxxbxxdxx"

要匹配的模式是:

"bcda"

该模式应解释如下:

  • b:字符串中有几个。第一个应该匹配。
  • c:字符串中没有一个,因此不会返回任何内容。
  • d:字符串末尾附近只有一个。它应该被退回。
  • a:字符串的开头有一个。由于首先寻找bcd并返回结果,因此不会返回a

预期回报是:

"bd"

正则表达式匹配可能不是实现此目的的正确方法,但我想请求帮助。基本的问题是:我可以使用正则表达式来一般地找到一个子串,它尽可能多地表示一个有序但不一定是连续的候选字符序列吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:1)

正如@sawa解释的那样,你不能用一个正则表达式做到这一点。这是一个递归解决方案。

def consecutive_matches(str, pattern)
  return '' if str.empty? || pattern.empty?
  ch, pat = pattern[0], pattern[1..-1]
  i = str.index(ch)
  if i
    ch + consecutive_matches(str[i+1..-1], pat)
  else             
    consecutive_matches(str, pat)
  end
end

str = "xxaxxbxxbxbxxbxxbxxbxxdxx"

consecutive_matches(str, "bcda") #=> "bd"
consecutive_matches(str, "abcd") #=> "abd"
consecutive_matches(str, "dabc") #=> "d"
consecutive_matches(str, "cfgh") #=> ""

答案 1 :(得分:-1)

单个正则表达式匹配是不可能的。正则表达式中的捕获必须是原始字符串的子字符串。 bd此处不是,因此无法将其作为单个捕获进行匹配。