【发布时间】:2018-06-21 08:52:03
【问题描述】:
我想找到一种方法来对字符串进行部分匹配。
我有两个 50 位二进制输入。如果任何输入与数据库(数组)中至少 5 位的数据匹配,我会打印输入。
假设我的输入是这样的。 X 是“无关紧要”位;会改成.,
11XX1100100010110111110110101001000010110101111111
数据库中的数据是
11001100100010110111110110101001000010110101111111
11001011011101001000001001010110111101001010000000
00110011011101001000001001010110111101001010000111
第一行数据完全匹配输入,所以我会打印出来。
第二行数据与输入不完全匹配,但前5位匹配,所以我也打印一下。
第三行数据与输入不完全匹配,但第二和第三位由于不关心条件匹配,最后三位匹配。因此,5 位(2nd + 3rd + 最后 3 位)是匹配的,所以我会打印这个。
我有一个仅用于完全匹配情况的 Perl 脚本,但我不知道如何针对部分匹配情况进行修改。
input.txt
11XX1100100010110111110110101001000010110101111111
1000011000111101001011110111001100100101111000010X
搜索.pl
#!/usr/bin/perl
use warnings;
use strict;
# Read input
open my $input_fh, '<', 'input.txt' or die $! ;
chomp ( my @input = <$input_fh> );
# input
# 11XX11001000101101111101101010010000101101011111X1
# 1000011000111101001011110111001100100101111000010X
# Replace 'X' with '.' which is the regex "don't care" character.
s/X/./g for @input;
# Compile a regex made of these two patterns.
my $search = join ( "|", @input );
$search = qr/$search/;
# Iterate database ( pasted in 'data' block for illustrative purposes )
while ( <DATA> ) {
my ( $id, $target, @rest ) = split;
# print if the target line matches
print if $target =~ /$search/;
}
# Currently, only fully matched ones are printed
__DATA__
11001100100010110111110110101001000010110101111101
11001011011101001000001001010110111101001010011111
00110011011101001000001001010110111101001010000111
【问题讨论】:
-
您的需求本质上是重要的。你不能简单地依靠正则表达式来做到这一点,这意味着你需要更复杂的过程?
-
我明白了,那么我认为基于字符的搜索是唯一的方式,就像 zdim 的回复一样。
-
您的代码甚至没有尝试遵循您描述的规则。当您不想再尝试时,Stack Overflow 并不是为了完成您的工作。正则表达式无法做到这一点,您应该设计和实现一种算法来满足您的需求。如果您进行了真正的尝试并且仍在苦苦挣扎,请在此处发布您的代码以寻求帮助,以了解您错过了什么。就目前而言,您只是要求免费编写代码,这是不可原谅的。
-
嗨,对不起,我知道规则。如果我的问题和代码不遵守规则,我会删除我的问题。对此感到抱歉。
-
我试图删除这篇文章,因为我的鳕鱼没有遵守规则。我无法删除此帖子