如何使用 Ruby 将任何模式与任何字符串匹配?

Posted

技术标签:

【中文标题】如何使用 Ruby 将任何模式与任何字符串匹配?【英文标题】:How to match any pattern to a any string using Ruby? 【发布时间】:2021-12-09 18:21:00 【问题描述】:

我想在 Ruby 中创建一个接受以下参数的函数:

模式字符串(例如“abab”、“aabb”、“aaaa”等) 输入字符串(例如“dogcatdogcat”、“carcarhousehouse”等)

如果字符串匹配模式,函数的返回应该是"true",否则返回"false"

我的第一步方法:

使用正则表达式将输入字符串分隔为单词数组(例如 ["dog", "cat", "dog", "cat"])。

我的正则表达式专业知识还不够好,无法为这个问题找到正确的正则表达式。

有谁知道如何执行适当的正则表达式,以便在假设输入字符串始终是某种形式的模式的情况下分离重复出现的单词?

【问题讨论】:

输入字符串是纯随机的吗?还是只包含固定字典中的单词? @spickermann 输入的字符串是纯随机的 如果输入字符串是anhydrous,考虑到a是英文单词,an是英文单词,hydro是英语单词,us是英语单词,hydrous是英语单词,anhydrous是英语单词? starfishalphanumericpodcastwebcastwardrivingairplanesailplane 呢? 请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案1】:

您可以使用捕获组和反向引用多次匹配相同的子字符串,例如:

abab = /\A(.+)(.+)\1\2\z/
aabb = /\A(.+)\1(.+)\2\z/
aaaa = /\A(.+)\1\1\1\z/

'dogcatdogcat'.match?(abab) #=> true
'dogcatdogcat'.match?(aabb) #=> false
'dogcatdogcat'.match?(aaaa) #=> false

'carcarhousehouse'.match?(abab) #=> false
'carcarhousehouse'.match?(aabb) #=> true
'carcarhousehouse'.match?(aaaa) #=> false

在上述模式中,(.+) 定义了一个匹配一个或多个字符的捕获组。 \1 然后引用第一个捕获组并匹配相同的子字符串。 (\2 是第二组,依此类推)

\A\z 是匹配字符串开头和结尾的锚。

【讨论】:

感谢您富有洞察力的回答!这绝对是朝着正确的方向前进!唯一的问题是模式字符串不限于您列出的组合。模式字符串可以包括任何字符和任何长度。我猜正则表达式必须在运行时以某种方式动态构建? @rowingdan 你绝对可以做到。并且从您的模式字符串中构造正则表达式非常简单:每个字母的第一次出现变成(.+) 并且每个后续出现变成相应的索引,例如\1a\2b

以上是关于如何使用 Ruby 将任何模式与任何字符串匹配?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串与Javascript中的模式数组匹配?

正则表达式

如何使用正则表达式匹配 Ruby 中包含特殊字符的重复模式?

如何使用与PostgreSQL和Python的模式匹配与多个百分比(%)符号?

如果 URL 与 Go 中的任何模式都不匹配,如何提供文件?

Hive正则表达式