我正在尝试捕获带连字符的单词中所有连字符的位置,以便我可以加载包含这些连字符位置的哈希值(在文本中,而不是单词中)。目前,我正在尝试在非捕获组内使用捕获组……但它只捕获最后一个连字符。
my $word = shift (@_);
my $word_start_pos = shift (@_);
my $text = shift (@_);
my $dash_pos = 0;
my $exp = 0;
my $pos = 0;
my $test_char = '';
if ($word =~ /^(?:[\p{L&}0-9\.\'\/]{1,}([\-])){7,}[\p{L&}0-9\.\'\/]{1,}$/) {
foreach $exp (1..$#-) {
$pos = $-[$exp];
$dash_pos = $word_start_pos + $pos;
$test_char = substr($text, $dash_pos, 1);
if ($test_char =~ /^[\-]$/) {
&load_changes('-', $dash_pos, 'Dash', ' ', 'Replace');
}
}
}
演示:
在上下文中,你可以替换
和
我认为使用正则表达式完成这项任务没有任何好处。它根本不适合这项工作。以下是两种更简单、更高效的替代方法:
输出:
(请注意,位置以 0 为基数。)
手动重置
pos
变量可能不是最好的主意。基本上,这样做会使全局匹配在字符串中来回跳转,而不是从头到尾进行处理。@-
这是和数组的直接使用@+
,它们与值一起工作pos
。@+
相当于pos
每个匹配项的值。听起来你想要的是@-
值。这是代码...
输出看起来像这样...
打了 54 个字