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

时间:2016-03-10 07:17:02

标签: regex string perl comparison substring

我有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)

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

  

我是使用OR完成的,我通过交换变量来检查这两种情况。

我只需知道其中一个字符串是另一个字符串。 但我需要更好的技术才能这样做? 提前谢谢!

3 个答案:

答案 0 :(得分:3)

  

@zdim一个声明

自己解决,

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";

答案 1 :(得分:1)

以下是提交该对并获取包围另一个的字符串的简单方法,或rc*

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内的单词的副本。

undef

评论澄清说,返回一个代码来区分哪个字符串在另一个内部可能很有用。

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

($sc) = map { /^($s1).*$s1|(^$s2).*$s2/ ? ($1 && 1) || ($2 && 2) : () } ("$s1$s2", "$s2$s1"); 包含$sc1$s1$s2 2$s2$s1,或者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) (不同)。

答案 2 :(得分:1)

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

if (object[0] is Class1) { ... }
if (object[1] is Class2) { ... }

其中1表示$ sb是$ sa的substr,-1表示$ sa是$ sb的substr。