我环顾四周但是找不到解决问题的方法。
我有一个包含两个字符串input
的数组,并希望测试数组中哪个元素包含精确的子字符串Test
。
我尝试过的一件事(在众多其他尝试中):
input = ["Test's string", "Test string"]
# Alternative input array that it needs to work on:
# ["Testing string", "some Test string"]
substring = "Test"
if (input[0].match(/\b#{substring}\b/))
puts "Test 0 "
# Do something...
elsif (input[1].match(/\b#{substring}\b/))
puts "Test 1"
# Do something different...
end
所需的结果是"Test 1"
的打印。输入可能更复杂但总体而言我正在寻找一种方法来查找较长字符串中子字符串的精确匹配。
我觉得这应该是一个相当微不足道的正则表达式,但我无法想出正确的模式。任何帮助将不胜感激!
答案 0 :(得分:3)
以下代码可能就是您要找的。 p>
input = ["Testing string", "Test string"]
substring = "Test"
if (input[0].match(/[^|\s]#{substring}[\s|$]/)
puts "Test 0 "
elsif (input[1].match(/[^|\s]#{substring}[\s|$]/)
puts "Test 1"
end
模式的含义/ [^ | \ s]#{substring} [\ s | $] /是
[^ | \ s]:子字符串的左侧是字符串(^)或空格的开头,
[\ s | $]:子字符串的右侧是空格或字符串结尾($)。
答案 1 :(得分:2)
其中一种方法如下:
input = ["Testing string", "Test"]
"Test #{ input.index { |s| s[/\bTest\b/] } }"
#=> "Test 1"
input = ["Test", "Testing string"]
"Test #{ input.index { |s| s[/\bTest\b/] } }"
#=> "Test 0"
\b
是正则表达式表示单词边界。
也许你想要一个方法来返回包含单词的input
的第一个元素的索引?那可能是:
def matching_index(input, word)
input.index { |s| s[/\b#{word}\b/i] }
end
input = ["Testing string", "Test"]
matching_index(input, "Test") #=> 1
matching_index(input, "test") #=> 1
matching_index(input, "Testing") #=> 0
matching_index(input, "Testy") #=> nil
然后你可以像这样使用它,例如:
word = 'Test'
puts "The matching element for '#{word}' is at index #{ matching_index(input, word) }"
#=> The matching element for 'Test' is at index 1
word = "Testing"
puts "The matching element for '#{word}' is '#{ input[matching_index(input, word)] }'"
#The matching element for 'Testing' is 'Testing string'
答案 2 :(得分:0)
问题出在你身上。在您的原始问题中,单词Test将匹配第一个字符串,因为'将匹配\ b字边界。这是一个完美的匹配,并正在响应"测试0"正确。您需要确定如何终止搜索。如果您的输入包含特殊字符,我认为正则表达式无法正常工作。 / \ bTest my $ money。* /永远不会匹配,因为你的子字符串中的$。
如果输入数组中有多个匹配项,会发生什么?你想对所有人或第一个人做点什么吗?