【问题标题】:Find a word which is after a pattern and before another pattern using perl使用 perl 查找一个模式之后和另一个模式之前的单词
【发布时间】:2016-09-25 11:09:26
【问题描述】:

我想在文件中查找特定模式之后和特定模式之前的单词。 以下是文件中的内容:

print("Hi", "My name is", "Tej");

所以,我想单独获取单词Tej 并将其存储到一个数组中。同样,我有许多与上述模式相似但名称不同的此类文件,因此我想将所有这些名称推送到一个数组中。即我想要来自模式 print("Hi", "My name is", " 之后和模式 "); 之前的文件中的单词。

有时,逗号后面的空格会丢失。

我编写了用于打开文件并将文件句柄传递给函数以搜索模式前后的单词的脚本。函数代码如下:

sub search{                                    
my $file_handle = shift;
while (<$file_handle>)
{
/.print("Hi", "My name is", "[\s]+([A-Za-z_0-9]+)/ ;
push @array, $1;
}
}  

我知道正则表达式不起作用,但我不确定如何找到我需要的单词。提供的任何帮助表示赞赏。 谢谢

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    我会这样做:

    sub search {                                    
        my $file_handle = shift;
        while (<$file_handle>) {
            if (/print\("Hi", ?"My name is", ?"([^"]+)"\);/) {
                push @array, $1;
            }
        }
    }
    

    我转义了正则表达式中的特殊字符(在这种情况下为()),并使用"([^"]+)" 来匹配引号内的所有非引号。

    空格后面的问号表示空格的存在是可选的。

    【讨论】:

    • 感谢您的快速回复。你的逻辑有帮助。
    • 提示:if (/print\("Hi", ?"My name is", ?"([^"]+)"\);/) { push @array, $1; } 可以写成if (my ($name) = /print\("Hi", ?"My name is", ?"([^"]+)"\);/) { push @array, $name; }(避免不必要地使用全局变量)甚至push @array, /print\("Hi", ?"My name is", ?"([^"]+)"\);/;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多