正则表达式在转到另一个单词之前忽略某些单词

时间:2016-03-10 22:35:51

标签: ruby regex

我有一个包含此顺序的项目列表的文件

List of items to stash (10 items):

                    dd98a4  41871
                    dd98a4  41872
                    dd98a4  41873
                    dd98a4  41874
                    dd98a4  41875
                    dd98a4  41876
                    dd98a4  41877
                    dd98a4  41878
                    dd98a4  41879
                    dd98a4  41880

我还有很多其他列表,我在这里没有包含在同一个文件中。我想得到一个正则表达式,用于检查项目"41879"是否在"要隐藏的项目列表中#34;。所以要检查字符串"要隐藏的项目列表< 忽略其他所有内容> dd98a4 41879"。红宝石中是否有一个简单的正则表达式?

非常感谢任何帮助

2 个答案:

答案 0 :(得分:0)

假设格式为:

list1: item1 item2 list2: item1 item2 item3

你正在寻找除了另一个和你的项目之外的任何东西:

<NAME OF LIST>:[^:]*<ITEM> 替换和你的字符串。

在此测试:http://rubular.com/r/H80Se07I1h

答案 1 :(得分:0)

假设我们从文件中读取以下内容:

ListView

并给出

str = <<_

List of items to hide (3 items):

                    cc98a4  41878
                    cc98a4  41879
                    cc98a4  41880

List of items to stash (3 items):

                    dd98a4  41878
                    dd98a4  41879
                    dd98a4  41880

List of items to discard (3 items):

                    ee98a4  41878
                    ee98a4  41879
                    ee98a4  41880
_

以下正则表达式匹配与列表list = "List of items to stash" id = 41879 关联的行中id之前的描述符:

list

请注意Ruby如何将r = /^#{list}[^\n]*\n+(?:\s*\w+\s+\d+[^\n]*\n)*\s*\K\w+(?=\s+#{id})/ #=> /^List of items to stash[^\n]*\n+(?:\s*\w+\s+\d+[^\n]*\n)*\s*\K\w+(?=\s+41879)/ list替换为正则表达式中的值。

果然:

id

这个正则表达式看起来有点复杂。然而,当你把它分解成碎片时,它并没有那么糟糕:

str[r]
  #=> "dd98a4"