Regex 如何在perl中获取紧跟其他单词的单词

Regex 如何在perl中获取紧跟其他单词的单词,regex,perl,Regex,Perl,假设我有一个包含内容的文件 SQL> SELECT 'conn '||u.name ||'/abcd123'||chr(10) ||'create '||DECODE(U.NAME,'PUBLIC','public ')||'database link ' || L.NAME|| ' connect to ' || L.USERID || ' identified by values '''|| 2 L.PASSWORDX||''' using ''' || L.host || ''

假设我有一个包含内容的文件

SQL> SELECT 'conn '||u.name ||'/abcd123'||chr(10) ||'create '||DECODE(U.NAME,'PUBLIC','public ')||'database link ' || L.NAME|| ' connect to ' || L.USERID || ' identified by values '''||
  2  L.PASSWORDX||''' using ''' || L.host || ''''||';' FROM system.xpr_link$ L, system.xpr_user$ U WHERE L.OWNER# = U.USER# and u.name not in ('APPS','SYS','SYSTEM') order by l.OWNER#;
conn GESADM/abcd123                                                                                             


create database link ODSPUSH.CISCO.COM connect to XXDM identified by values '056D98F3367CAC4478383FFB673E4D22329E172F2B25778BE3' using 'TS3ODS';                                                        

conn GESADM/abcd123                                                                                                                                                                                     
create database link TS3CFN.CISCO.COM connect to GESADM identified by values '05A0E92F39E91BA002F98DE9A46FC72B31572483E12D3AAB67' using 'TS3CFN';                                                       


create database link SYNSTG.CISCO.COM connect to SYN_CLNTSRV identified by values '066C10B37E3A3D0A3AA96B9FDE063585B662E3921F3C3F5A3E224BD4394A7BD659DAD174ABDE36594E7F3B466D6B0DCF78F13D75BA3B47090D295
8F8604E637462A2A41F74458E0C0EB649EE9A537AD2AE109A20B2DA09E5F9A28D666B8980651B79C0E76BBD6CBBCD169645970FDD615291C8557DBC79F527BF32E14A845025' using 'SYNSTG'; 

如何在Perl中使用正则表达式获取单词“values”后面的单词。

在示例字符串中出现“
values
”的每个地方,前面的单词(正如您在编辑文章之前要求的)都是“
by
”,因此我不知道捕获后面跟着“
values
”的每个单词有多大用处

尽管如此,这似乎是你想要的(在编辑改变意思之前),这里有一种方法:

while( $string =~ m/\b(\p{Alpha}+)\b\s*values/g ) {
  print "$1\n";
}
…将产生以下输出:

by
by
by
by
另一方面,如果您打算说“单词‘values’后面引用的数值”(这与您编辑的文章现在要求的内容类似),那么这将起作用:

while( $string =~ m/values\s*'([^']+)'/g ) {
  print "$1\n";
}
…这就产生了

056D98F3367CAC4478383FFB673E4D22329E172F2B25778BE3
05A0E92F39E91BA002F98DE9A46FC72B31572483E12D3AAB67
066C10B37E3A3D0A3AA96B9FDE063585B662E3921F3C3F5A3E224BD4394A7BD659DAD174ABDE36594E7F3B466D6B0DCF78F13D75BA3B47090D295
8F8604E637462A2A41F74458E0C0EB649EE9A537AD2AE109A20B2DA09E5F9A28D666B8980651B79C0E76BBD6CBBCD169645970FDD615291C8557DBC79F527BF32E14A845025

我知道你想从文本文件中提取字符串?我有这个权利吗

如果您谈论的是单词
后的字符串:

while ($subject =~ m/values '\K[^']*/g) {
    # matched text = $&
}

如果您正在谈论
之后的字符串,请使用

while ($subject =~ m/values '[^']*' using '\K[^']*/g) {
    # matched text = $&
}


让我知道你想要哪一个,我会补充说明。

你必须先尝试编码一些东西,然后向我们展示你所拥有的东西,即使它不起作用。这可能会对大卫有所帮助,我相信他的意思是“跟随”而不是“跟随”。我已经相应地编辑了他的文章。你可能是对的,但这构成了一个根本性的改变,因为它颠倒了原意。但我会更新我的帖子,以包含这种可能性(因为它可能是准确的)。