我有一个字符串,我想从中提取数据库表名称。我不知道该字符串是否包含换行符或回车符。我不确定如何拆分该部分。这是字符串。这是从数据库查询中提取的。
INSERT INTO DWH_CCP.TGT.CCP_ATTR_XREF
SELECT
ATTR_KEY
,ATTR_NAME
,ATTR_DESC
我的代码如下:
while($string =~ / INTO (\S+?\.\S+?)[\s\n\r()]/gi) {
my $table = $1;
}
print "\ntable is $table\n";
但输出内容如下:
table is DWH_AIR.DWH_CCP.TGT.CCP_ATTR_XREFSELECTATTR_KEY,ATTR_NAME,ATTR_DESC
代码本身存在多个问题,并且正则表达式过于复杂。
单程
正则表达式匹配返回列表上下文中的捕获列表,此处由左侧的括号提供。如果没有匹配项,则变量保持不变
undef
。\S
匹配所有非空格字符,包括句点 (.
),因此在任何空格\S+
处停止匹配(包括换行符和回车符)。修饰符用于表示可能为小写的情况。i
INTO
然后,您可以测试
$table_name
,以检查该模式是否在$string
。如果由于某种原因您想要将此测试与其余代码隔离,您可以将其放在里面,
if
但您仍然必须声明变量以保存条件之外的名称if
,并且如果在外部需要它则阻止,所以为什么要费心呢if
。†如果这一切都在一个块内完成,你可以这样做
while
如果问题中有更多细节可以解释这种复杂的模式,那么请将其揭示出来——将它们包括在问题中。要评论正则表达式本身,给定显示的表名,对于名称本身,您所需要的就是
(\S+)
,它应该跟在后面INTO
。如果您希望模式更精确,则显示的名称与匹配
[A-Z_.]+
,但排除小写字母是不明智的——为什么要排除数字?——那么也许将名称中可能存在的任何其他特定字符添加到字符类中。
主要正则表达式参考:perlretut和perlre。
†
while
问题中显示的 在此处是不必要的,除非您确实$string
有多个insert
带有表名的语句。您可以使用它代替if
虽然 但如果 仅包含一个表名,则会产生误导$string
。该代码的另一个问题是,由于变量是在内部声明的
$table
,因此它在块之外不存在,所以它是它的“范围”,即该块。while