Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
告诉regex search仅在某个索引处开始搜索_Regex_String_Perl - Fatal编程技术网

告诉regex search仅在某个索引处开始搜索

告诉regex search仅在某个索引处开始搜索,regex,string,perl,Regex,String,Perl,通常,正则表达式搜索将从我提供的字符串开始搜索匹配项。在这个特殊的例子中,我使用的是一个非常大的字符串(高达数兆字节),我希望在该字符串上运行连续的正则表达式搜索,但从特定的索引开始 现在,我意识到我可以使用substr函数在开始时简单地丢弃我想从搜索中排除的部分,但我担心这不是很有效,因为我会做几千次 我想使用它的具体目的是在一个非常大的文本中从一个词跳到另一个词,跳过空白(不管它是简单的空格、制表符、换行符等等)。我知道我可以使用split函数通过传递\s+作为分隔符来将文本拆分为单词,但这

通常,正则表达式搜索将从我提供的字符串开始搜索匹配项。在这个特殊的例子中,我使用的是一个非常大的字符串(高达数兆字节),我希望在该字符串上运行连续的正则表达式搜索,但从特定的索引开始

现在,我意识到我可以使用
substr
函数在开始时简单地丢弃我想从搜索中排除的部分,但我担心这不是很有效,因为我会做几千次


我想使用它的具体目的是在一个非常大的文本中从一个词跳到另一个词,跳过空白(不管它是简单的空格、制表符、换行符等等)。我知道我可以使用split函数通过传递
\s+
作为分隔符来将文本拆分为单词,但这会使我以后的事情变得更复杂,因为还有其他各种可能的单词分隔符,例如引号(好的,我在这里使用了“单词”一词),因此,如果我可以在同一个字符串上使用连续的正则表达式搜索从一个词跳到另一个词,并且总是指定下一个索引,这样我就更容易了。这在Perl中可行吗?

因此您希望与文本体中的单词进行匹配

(示例查找包含
i
的单词)

你认为单词的起始位置会有帮助,但它没有用处。以下说明了获取并使用这些职位的情况:

my @positions;
while ($text =~ /\w+/g) {
   push @positions, $-[0];
}

my @matches;
for my $pos (@positions) {
   pos($text) = $pos;
   push @matches $1 if $text =~ /\G(\w*i\w*)/g;
}
如果不使用起始位置会简单得多。除了简单得多之外,我们还不需要两种不同的正则表达式模式就单词的构成达成一致。结果如下:

my @matches;
while ($text =~ /\b(\w*i\w*)/g) {
   push @matches $1;
}

然而,一个更好的办法是提前增加单词本身。这种方法允许更简单的模式和更高级的“单词”定义[1]


  • 例如,可以使用适当的标记器

  • 由于没有更多的信息,我只能建议

    在执行全局正则表达式搜索时,引擎会保存上一次匹配结束的位置,以便知道从何处开始搜索下一次迭代。
    pos
    函数允许访问该值,并允许显式设置该值,以便后续的
    m//g
    将开始查看指定位置,而不是字符串的开头

    这个程序给出了一个例子。将在字符串中搜索偏移列表后的第一个非空格字符,并显示找到的字符(如果有)

    请注意,全局匹配必须在标量上下文中完成,这里由
    if
    应用,以便只报告下一个匹配。否则,全局搜索将一直运行到文件末尾,只留下最后一个匹配的信息

    use strict;
    use warnings 'all';
    use feature 'say';
    
    my $str = 'a  b  c  d  e  f  g  h  i  j  k  l  m  n';
    #          0123456789012345678901234567890123456789
    #                    1         2         3
    
    for ( 4, 31, 16, 22 ) {
    
        pos($str) = $_;
    
        say $1 if $str =~ /(\S)/g;
    }
    
    输出
    我的意思是,它看起来像一个“量化点”,或多或少会这样做
    {50}任何模式
    都会从第50个字符后面的位置开始…你是在
    循环中寻找
    m//g
    吗?你的问题被否决了,因为有很多文本,但是没有一个简单的示例脚本可以显示您正在做什么。您将如何建立这些索引以启动搜索?如果您至少能更清楚地描述您在这些角色位置上要做的事情,这会有所帮助。你在寻找什么样的东西,你在使用什么样的模式?
    my @matches;
    while ($text =~ /(\w+)/g) {
       my $word = $1;
       push @matches, $word if $word =~ /i/;
    }
    
    my @matches = grep { /i/ } $text =~ /\w+/g;
    
    use strict;
    use warnings 'all';
    use feature 'say';
    
    my $str = 'a  b  c  d  e  f  g  h  i  j  k  l  m  n';
    #          0123456789012345678901234567890123456789
    #                    1         2         3
    
    for ( 4, 31, 16, 22 ) {
    
        pos($str) = $_;
    
        say $1 if $str =~ /(\S)/g;
    }
    
    c
    l
    g
    i