我需要在另一个字符串y中执行正则表达式搜索字符串x,但是我需要知道使用其他常规字符串标记(拆分)字符串y之后命中的第一个字符的标记(单词)索引表达(例如白色空间)。第一个正则表达式可能会找到一个子字符串,所以我不能保证它会在令牌(word)的开头停止。
实现此目的的最佳算法是什么。一个简单的方法如下:
(这假设split函数将分裂字符(例如空格)存储为数组元素,这非常浪费。
具体(简单)示例:假设我想知道字符串“月亮是由奶酪制成”中搜索“ade”的标记(单词)索引。该函数应该给我回答:3(对于零索引数组)。
==编辑==
当正则表达式搜索跨越标记边界时,该算法也需要工作。例如,在“月亮是由奶酪制成”中搜索“de of ch”时,它应该再次返回索引“3”。
答案 0 :(得分:1)
根据您的更新:
#!/usr/bin/perl -l
use strict;
use warnings;
my $string = "The moon is made of cheese";
my $search = 'de of ch';
my $pos = index($string, $search);
if ($pos != -1) {
my $substr = substr($string, 0, $pos);
my @words = split /\s+/, $substr;
print "found in word #", $#words, "\n";
} else {
print "not found\n";
}
<强>输出:强>
found in word #3
答案 1 :(得分:1)
查找字符串中的第一个模式,然后计算第一个模式之前的字符串部分中第二个模式字符串的出现次数。
以下是执行此任务的perl脚本:
#!/bin/perl -w
my $string = 'The moon is made of cheese';
my $lookedfor = 'de of che';
my $separator = q/\W+/;
my $count = undef;
if ($string =~ /(.*?)$lookedfor/) {
# Keep the smallest (.*?) part of string before the match.
my $firstpart = $1;
$count = 0;
# Count the number of separator
$count++ while $firstpart =~ m/$separator/g;
}
if (defined $count) {
printf "index of '%s' in '%s' is %d\n", $lookedfor, $string, $count;
} else {
printf "No occurence of '%s' in '%s'\n", $lookedfor, $string;
}