Perl:我们如何检查哪个字符串是另一个字符串的子字符串?

Perl: How can we check that which string is a sub string of another?

我有 2 个字符串 A 和 B。现在这两个字符串中的任何一个都可以是另一个字符串的子字符串。例如:

 Case:1-- A = "abcdef" and B = "abc" //String B is Substring of A.

Case:2-- A = "xyz" and B = "wxyza"  // String A is Substring of B.

现在我知道索引函数了

 index($substr, $str)

但是我不知道哪个是另一个的子串,所以不能传递参数

I have done it using an OR where I check for both the cases by swapping the variables.

我只需要知道其中一个字符串是另一个字符串的子字符串。 但我需要更好的技术来做到这一点? 提前致谢!

这是提交对并获取包含另一个的字符串的简单方法,或者 undef

($enclosing) = grep { /$s2/ && /$s1/ } ($s1, $s2);

这是一种获取按 ($inside, $enclosing) 排序的字符串或获取空列表

的方法
@sorted = sort { "$b$a" =~ /^$b.*$b/ <=> "$a$b" =~ /^$a.*$a/ }
          grep { $s1 =~ /$s2/ || $s2 =~ /$s1/ } ($s1, $s2);

这首先通过一个双向正则表达式过滤掉不匹配的情况,通过一个空列表。

在这两种情况下,相同的词都没有以任何方式被标记为这样,我不知道它们怎么可能。
然而,它们确实相互包含并且可能可以以相同的方式进一步处理。
此答案中提供的唯一解决方案是下面的 @mask,在这种情况下设置为 (1,1)

这里的所有代码都在 use warnings 下运行,为简洁起见省略了它。


最初发布。 Returns 另一个或 undef.

中的单词的副本
($in) =  map { /^($s1).*$s1|(^$s2).*$s2/ ?  //  : () } ("$s1$s2", "$s2$s1");

评论阐明,返回一个代码来区分哪个字符串在另一个字符串中可能会有用。

($sc) =  map { /^($s1).*$s1|(^$s2).*$s2/ ? ( && 1) || ( && 2) : () } 
              ("$s1$s2", "$s2$s1");

$s1包含在$s2中时,$sc1,或者当$s2包含在[=23=中时,2 ],否则 undef


根据这意味着如何使用,上面的来源可能有用

@mask =  map { /^($s1.*$s1)|(^$s2.*$s2)/ ? 1 : 0 } ("$s1$s2", "$s2$s1");

@mask(bool, bool) 是否单词 ($s1, $s2) 在另一个里面。

就是:(1,1)(等于),或者(1,0)或者(0,1)(对于$s1或者$s2里面的另一个)或者(0,0)(不同)。

@zdim one statement

打倒自己,

print length($s1) > length($s2) 
  ? "s2 is @{[ index($s1,$s2) <0 && 'NOT ']}substr of s1"
  : "s1 is @{[ index($s2,$s1) <0 && 'NOT ']}substr of s2";

如果您确定其中一个字符串是另一个字符串的子字符串,您可以使用如下内容:

my $c = ($sa =~ /$sb/) || (-1) *($sb =~ /$sa/);

其中 1 表示 $sb 是 $sa 的子字符串,-1 表示 $sa 是 $sb 的子字符串。