Regex perl正则表达式只将字符串中的精确匹配捕获到变量中

Regex perl正则表达式只将字符串中的精确匹配捕获到变量中,regex,perl,Regex,Perl,我需要这个正则表达式的帮助,以便只捕获字符串中的精确匹配并将其放入变量中 我只想推断这些值(固定列表;无其他数字): 从给定的字符串 例如: $str = "this is the code 004010H222A1 the rest is irrelevant"; $str = "the random number is 004010H223A2 ** anything else is irrelevant"; $str = "the last lottery number 004010H22

我需要这个正则表达式的帮助,以便只捕获字符串中的精确匹配并将其放入变量中

我只想推断这些值(固定列表;无其他数字):

从给定的字符串

例如:

$str = "this is the code 004010H222A1 the rest is irrelevant";
$str = "the random number is 004010H223A2 ** anything else is irrelevant";
$str = "the last lottery number 004010H220A1 ~~ the rest is irrelevant";
$str = "yet another random sentence 004010H279A1 the rest is irrelevant";
$str = "any sentence before what i want 004010H279A1 the rest is irrelevant";
$str = "last winning number 004010H217~~~";


if ($str =~ /\b(004010H[2][1|2|7][0|2|3|7|9])(A[1|2])?\b/){
print "found exact match\n";
##put result into a variable
##example:
## $exact_match = <found eg 004010H222A1>; 
##print $exact_match;
}
$str=“这是代码004010H222A1,其余与此无关”;
$str=“随机数为004010H223A2**其他任何内容都不相关”;
$str=“最后一个彩票号码004010H220A1~~其余的不相关”;
$str=“又一个随机句子004010H279A1,其余的都无关紧要”;
$str=“我想要的之前的任何句子004010H279A1其余的都不相关”;
$str=“上次中奖号码004010H217~~”;
如果($str=~/\b(004010H[2][1 | 2 | 7][0 | 2 | 3 | 7 | 9])(A[1 | 2])?\b/){
打印“找到完全匹配的\n”;
##将结果放入变量中
##例如:
##$exact_match=;
##打印$exact_匹配;
}

如何将所需内容的精确匹配捕获到变量中,然后显示它?也许我只是看不见森林。提前感谢您的帮助

仅为我的两分钱:

\b004010H2[127][02379](?:A[12])?\b
# \b - match a word boundary
# match 004010H2 literally
# [127] one of 1,2 or 7
# followed by one of 0,2,3,7 or 9
# (?:....)? is a non capturing group and optional in this case
提示:显然,这可以匹配您的数字,但其他组合,如
004010H210A2
也可以。这完全取决于您的输入字符串。如果您只有这六种选择,那么使用简单的字符串函数可能更安全。

请参阅。

,查看给定的模式列表

my @fixed = qw(004010H222A1 004010H223A2 004010H220A1 
    004010H279A1 004010H279A1 004010H217);

my $str = "this is the code 004010H222A1 the rest is irrelevant";

my @found = grep { $str =~ /$_/ } @fixed;
什么匹配字符串中的所有此类模式。请注意,您可能需要单词边界(
/\b$\u\b/
),尽管如图所示,如果周围文本中的模式如此不同,则不需要。如果模式本身包含任何非单词字符,则需要为“边界”构建子模式

如果您确定字符串中只有一个,或者只需要第一个

my ($found) = grep { $str =~ /$_/ } @fixed;
或者先通过交替构建模式

my $re = join '|', map { quotemeta } @fixed;

my $found = $str =~ /$re/;  # consider using word-boudaries /\b$re\b/
这可能更有效,因为它只启动正则表达式引擎一次,但另一方面,只有几个(或一个?)选项,我们确实参与了所有开销来形成交替

根据详细信息,您可能希望先按
长度
排序,可以按最长或最短排序

my $re = join '|', map { quotemeta } sort { length $a <=> lenght $b } @fixed;
...

如果模式前面紧跟着一个非数字字符(如
~
),而不仅仅是空格,则上述匹配。它还允许小写字母,如果它们不在那里,则将a-z放入。如果确定它有前导零,您可以进一步限制它

^.*(004010H[0-9A]{0,10})或仅此用于该集合:^.*(004010H222A1 | 004010H223A2 | 004010H220A1 | 004010H279A1 | 004010H279A1 | 004010H217)就是它!太多了。我一直在玩,我喜欢你的主意。thnxagain@user2585000欢迎,很高兴你喜欢它:)当你有一个固定模式列表时,这是一个很好的小技巧。thnx,那个演示网站帮助调试了一些提出的想法。thnx还用于指出可选部件捕获组
my $re = join '|', map { quotemeta } sort { length $a <=> lenght $b } @fixed;
...
my $pattern = qr/([0-9]+[a-zA-Z0-9]+)[^a-zA-Z0-9]/;

my ($found) = $str =~ /$pattern/;