【问题标题】:Perl: How can we check that which string is a sub string of another?Perl:我们如何检查哪个字符串是另一个字符串的子字符串?
【发布时间】:2016-06-24 21:53:54
【问题描述】:

我有两个字符串,分别是 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 完成了它,我通过交换变量来检查这两种情况。

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

【问题讨论】:

  • 检查index()之前的两个字符串的长度如何?
  • 如果长度相同怎么办?说 A ="abcd" B="bcef" 那么我将无法决定将哪个作为子字符串传递
  • 你所说的“更好的技术”是什么意思?一句话,一个语句,最高效,最优雅……?
  • 显然,如果它们的长度相同,顺序并不重要。
  • 您确实需要知道包含哪一个(在另一个中),是吗?那将是一个复杂的陈述。

标签: regex string perl comparison substring


【解决方案1】:

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

【讨论】:

  • nice :) 这是 one 声明? :+1
  • @zdim 可能是。 :)
  • @EugenKonkov 可能不是完整的答案,因为 s1 是 s2 的子字符串,而 s2 同时是 s1 的子字符串。
【解决方案2】:

这是提交对并获取包含另一个的字符串或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");

$s1 包含在$s2 中时$sc1,或者当$s2 包含在$s1 中时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)(不同)。

【讨论】:

  • 好吧,如果 s1 是 s2 的子串,那么掩码包含 1,0 对吧??
  • 所以我的目的是我需要检查哪一个是另一个的 substr。我可以遵循一个约定,比如如果响应为 0,第一个是其他的子,如果响应为 1,反之亦然。但你所做的有帮助!
  • 不,我只是将它们添加到地图中,仅此而已。谢谢顺便说一句;)
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-12
    • 2019-05-11
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多