Chinaunix

标题: 是否有简洁的方法比较出两个字符串中相同的部分? [打印本页]

作者: hztj2005    时间: 2016-10-13 10:35
标题: 是否有简洁的方法比较出两个字符串中相同的部分?
1. 我们用毛笔写字。
2.小孩用铅笔写字。
是否有简洁的方法比较出两个字符串中相同的部分,标记如下:
1. 我们(用)毛(笔写字。)
2.小孩(用)铅(笔写字。)
作者: sunzhiguolu    时间: 2016-10-13 12:30
1. 我们用毛笔写字。
2.小孩用铅笔写字。

方法比较笨:
用 1. 中的每个字符去匹配 2. 字符串, 成功的就是相同的字符, 否则不同.
作者: YQ_Liu    时间: 2016-10-13 18:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: moperyblue    时间: 2016-10-13 20:43
本帖最后由 moperyblue 于 2016-10-22 20:44 编辑

more 1:
  1. 1. 我们用毛笔写字。
  2. 2.小孩用铅笔写字。
复制代码
  1. sed -r '/\n/!N;s/(.+)(.*\n.*)(\1)/(\1)\n\2(\3)/;P;D' 1|sed ':a;N;/\n$/!s/\n//;ta;P;d'|sed -r -e'/^[0-9]+\s*.\./s/[()]//'{2,1}''
复制代码

作者: sunzhiguolu    时间: 2016-10-13 22:32
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;


  5. binmode (STDOUT, ":encoding(utf8)");
  6. my $str1 = '我们用毛笔写字。';
  7. my $str2 = '小孩用铅笔写字。';

  8. my @aList1 = $str1 =~ /./g;
  9. my @aList2 = $str2 =~ /./g;

  10. for (0 .. $#aList1){
  11.     print $aList1[$_] if ($aList1[$_] eq $aList2[$_]);
  12. }
复制代码

作者: hztj2005    时间: 2016-10-13 23:24
YQ_Liu 发表于 2016-10-13 18:00
分别写到两个文件中 用diff

diff是一个模块?还是函数?

作者: hztj2005    时间: 2016-10-13 23:26
sunzhiguolu 发表于 2016-10-13 22:32

好像也没有更好的方法。

#my @aList1 = $str1 =~ /./g;
#my @aList2 = $str2 =~ /./g;

以上两行这样也可以:
my @aList1 = split(//,$str1);
my @aList2 = split(//,$str2);


作者: hztj2005    时间: 2016-10-13 23:28
moperyblue 发表于 2016-10-13 20:43
more 1:

这该是命令行中执行吧。
我在win10下用ActivePerl似乎无法执行这样的命令。


作者: moperyblue    时间: 2016-10-14 10:34
回复 8# hztj2005


win系统 装个Cygwin去玩一下 perl可以调用shell命令吧
作者: sunzhiguolu    时间: 2016-10-14 11:34
回复 7# hztj2005
其他情况我能想到的就 hash 了.


作者: StarWingsss    时间: 2016-10-21 15:10
如果你的文本是竖着写就好了
w x
m h
y  y
m q
b  b
x  x
z  z

awk '{if($1==$2) print NR,$1}' 1.txt

作者: hztj2005    时间: 2016-10-22 19:32
StarWingsss 发表于 2016-10-21 15:10
如果你的文本是竖着写就好了
w x
m h

这倒不难,先把每个字符串分解成一个数组,即相当于竖着写。
Perl求数组的交集是否有适当模块?

作者: StarWingsss    时间: 2016-10-22 20:36
hztj2005 发表于 2016-10-22 19:32
这倒不难,先把每个字符串分解成一个数组,即相当于竖着写。
Perl求数组的交集是否有适当模块?

这个是不是join和split函数?

作者: rubyish    时间: 2016-11-01 08:20
本帖最后由 rubyish 于 2016-11-01 04:39 编辑

maybe:

我们可以(用)毛(笔写字。)
但是小孩什么时候(用)铅(笔)可以(写字。)

是否(有简洁的)方法(比较出两个字符串中相同)的(部分?)
(有简洁的比较出两个字符串中相同部分)的方法(?)

if so?

#!/usr/bin/perl

use 5.024;
use utf8;
binmode STDOUT, ':encoding(utf8)';

sub gimme {
    for (@_) {
        my ( $C, $I ) = @$_;
        for my $i ( 0 .. $#$I ) {
            $C->[ $I->[$i] ] .= ')'
              if $I->[ $i - 1 ] - $I->[$i] != 1;
            $C->[ $I->[$i] ] = '(' . $C->[ $I->[$i] ]
              if $I->[$i] - $I->[ $i + 1 ] != 1;
        }
        say @$C;
    }
}

sub two {
    my ( $AB, $A, $B ) = @_;
    my ( $I, $J ) = ( [], [] );
    my ( $x, $y ) = ( ~~ @$A, ~~ @$B );

    while ( $x and $y ) {
        if    ( $AB->[$y][$x] == $AB->[ $y - 1 ][$x] ) { --$y }
        elsif ( $AB->[$y][$x] == $AB->[$y][ $x - 1 ] ) { --$x }
        else {
            push @$I, --$x;
            push @$J, --$y;
        }
    }

    [ $A, $I ], [ $B, $J ];
}

sub strings {
    my ( $A, $B ) = map [ split '', $$_ ], @_;
    my @AB = map [ (0) x ( @$A + 1 ) ], 0 .. @$B;
    for my $y ( 0 .. $#$B ) {
        for my $x ( 0 .. $#$A ) {
            $AB[ $y + 1 ][ $x + 1 ] =
                $A->[$x] eq $B->[$y] ? $AB[$y][$x] + 1
              : $AB[ $y + 1 ][$x] > $AB[$y][ $x + 1 ] ? $AB[ $y + 1 ][$x]
              : $AB[$y][ $x + 1 ];
        }
    }
    \@AB, $A, $B;
}


my ( $A, $B ) = (
    "我们可以用毛笔写字。",
    "但是小孩什么时候用铅笔可以写字。"
);

gimme two strings \$A, \$B;


( $A, $B ) = (
    '是否有简洁的方法比较出两个字符串中相同的部分?',
    '有简洁的比较出两个字符串中相同部分的方法?'
);
gimme two strings \$A, \$B;






作者: hztj2005    时间: 2016-11-04 20:32
StarWingsss 发表于 2016-10-22 20:36
这个是不是join和split函数?

$str1= "我们可以用毛笔写字。";
@res=split(//,$str1);

作者: sditmaner    时间: 2016-11-05 12:46
收藏了,感谢楼主的无私分享





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2