如何使用perl提供的特定格式的输入字符串提取子字符串?



我输入的字符串格式如下(右括号后可能有空格)

(c21bd4d76fe97759aa27a0c99bff6710)

我想把number和id提取到不同的变量中,我该怎么做?

我已经尝试了以下方法,但我想要的东西,将与regex工作,因为输入字符串后的额外空间打破了我的解决方案。

$text = "(1, 'c21bd4d76fe97759aa27a0c99bff6710')";
my @parts = split(/,/,$text);
my $rowd_id = substr(@parts[0],1);
my $id = substr(@parts[1],2,-2);
print "$rowd_id $idn";

您可以在正则表达式中使用捕获组:

my $text = "(1, 'c21bd4d76fe97759aa27a0c99bff6710')";
my $re = qr/(h*(w+)h*,h*'([^']+)'/;
my @captured = $text =~ $re;
if( @captured ) {
my $rowd_id = @captured[0];
my $id = @captured[1];
print "$rowd_id :: $idn";
}

输出:

1 :: c21bd4d76fe97759aa27a0c99bff6710

RegEx细节:

  • (: Match a(
  • h*:匹配0个或多个空白
  • (w+):匹配捕获组#1中的1+单词字符
  • h*:匹配0个或多个空白
  • ,: Match a,
  • h*:匹配0个或多个空白
  • ': Match a'
  • ([^']+):匹配1+捕获组#2中非'的任何字符
  • ': Match a'

利用正则表达式的强大功能可以达到预期的结果。

use strict;
use warnings;
use feature 'say';
my $text = "(1, 'c21bd4d76fe97759aa27a0c99bff6710')";
my($row,$id) = $text =~ /^((d+),s+'([^']+)'s*)/;
say "row=$row, id=$id";

$id的快速检查导致相信它具有十六进制格式,并且正则表达式可以更改为以下格式

my($row,$id) = $text =~ /^((d+),s+'([d,a-f]+)'s*)/i;

输出
row=1, id=c21bd4d76fe97759aa27a0c99bff6710

参考:教程正则表达式

相关内容

  • 没有找到相关文章

最新更新