正则表达式匹配特定的字符串序列

时间:2016-09-08 13:07:47

标签: ruby regex string

假设我有2个字符串数组 position1 = [' word1',' word2',' word3'] position2 = [' word4',' word1']

我希望在文本/字符串中检查文本中存在的子字符串#{target}是否后跟 position1 中的任何一个单词,或者跟随 position1 中的一个单词。 em> position2 甚至两者同时出现。同样地,好像我在#{target}左右看。

例如在句子"撰写报告和输入数据到内部系统,关于执法和移民文件"如果目标字是数据我想检查数组中是否包含左(输入)和右(上)字,或者数组中的其中一个字是否为真正的正则表达式匹配。有什么建议?我正在使用Ruby,我已经尝试了一些正则表达式但我无法使其工作。我还必须忽略其中任何潜在的特殊字符。

其中一个:

/^.*\b(#{joined_position1})\b.*$[\s,.:-_]*\b#{target}\b[\s,.:-_\\\/]*^.*\b(#{joined_position2})\b.*$/i

编辑:

我用正则表达式想出这个方法来捕捉左右这个词:

(\S+)\s*#{target}\s*(\S+)

但是,如果我想左右捕获多个单词,我可以改变什么呢?

1 个答案:

答案 0 :(得分:1)

如果您有两个字符串数组,那么您可以这样做:

matches = /^.+ (\S+) #{target} (\S+) .+$/.match(text)
if matches and (position1.include?(matches[1]) or position2.include?(matches[2]))
    do_something()
end

此正则表达式的作用是匹配文本中的目标词,并使用捕获组提取其旁边的单词。然后,代码会将这些单词与您的数组进行比较,如果它们位于正确的位置,则执行某些操作。更常见的版本可能如下所示:

def checkWords(target, text, leftArray, rightArray, numLeft = 1, numRight = 1)
    # Build the regex
    regex = "^.+"
    regex += " (\S+)" * numLeft
    regex += " #{target}"
    regex += " (\S+)" * numRight
    regex += " .+$"

    pattern = Regexp.new(regex)
    matches = pattern.match(text)

    return false if !matches

    for i in 1..numLeft
        return false if (!leftArray.include?(matches[i]))
    end

    for i in 1..numRight
        return false if (!rightArray.include?(matches[numLeft + i]))
    end

    return true
end

然后可以这样调用:

do_something() if checkWords("data", text, position1, position2, 2, 2)

我很确定它不是非常惯用的,但它让你对你如何以更一般的方式做你的事情有一个普遍的认识。