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
中时,$sc
是1
,或者当$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 的子字符串。
我有 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
中时,$sc
是1
,或者当$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 的子字符串。