gpt4 book ai didi

regex - 在 Perl 中,如何从正则表达式中获取匹配的子字符串?

转载 作者:行者123 更新时间:2023-12-03 23:04:53 25 4
gpt4 key购买 nike

我的程序读取其他程序的源代码并收集有关使用过的 SQL 查询的信息。我在获取子字符串时遇到问题。

...
$line = <FILE_IN>;
until( ($line =~m/$values_string/i && $line !~m/$rem_string/i) || eof )
{
if($line =~m/ \S{2}DT\S{3}/i)
{

# here I wish to get (only) substring that match to pattern \S{2}DT\S{3}
# (7 letter table name) and display it.
$line =~/\S{2}DT\S{3}/i;
print $line."\n";
...

结果打印打印整行而不是我期望的子字符串。我尝试了不同的方法,但我很少使用 Perl,并且可能会犯基本概念错误。 (行中表名的位置不固定。另一个问题是多次出现,即[... SELECT * FROM AADTTAB, BBDTTAB, ...] )。我怎样才能获得那个子串?

最佳答案

使用带括号的分组并存储第一组。

if( $line =~ /(\S{2}DT\S{3})/i )
{
my $substring = $1;
}

上面的代码解决了拉出第一个表名的直接问题。但是,问题也问了如何拉出所有表名。所以:
# FROM\s+     match FROM followed by one or more spaces
# (.+?) match (non-greedy) and capture any character until...
# (?:x|y) match x OR y - next 2 matches
# [^,]\s+[^,] match non-comma, 1 or more spaces, and non-comma
# \s*; match 0 or more spaces followed by a semi colon
if( $line =~ /FROM\s+(.+?)(?:[^,]\s+[^,]|\s*;)/i )
{
# $1 will be table1, table2, table3
my @tables = split(/\s*,\s*/, $1);
# delim is a space/comma
foreach(@tables)
{
# $_ = table name
print $_ . "\n";
}
}

结果:

如果 $line = "SELECT * FROM AADTTAB, BBDTTAB;"

输出:
AADTTAB
BBDTTAB

如果 $line = "SELECT * FROM AADTTAB;"

输出:
AADTTAB

Perl 版本:v5.10.0 专为 MSWin32-x86-multi-thread 构建

关于regex - 在 Perl 中,如何从正则表达式中获取匹配的子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1132042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com