首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >要替换的perl正则表达式

要替换的perl正则表达式
EN

Stack Overflow用户
提问于 2014-02-10 04:51:12
回答 2查看 101关注 0票数 1

在html文件中,我希望在中添加一个指向这些模式中数字的链接:1或1-2或1,3,6或1,3,4-6,9。我知道如何匹配简单的数字,例如第一个:

代码语言:javascript
复制
$html =~ s`\[\d+\]`\[<a href="#$1"><$1>\]`g; 

其他的模式呢?

另外,对于这个模式: 1,我只想查找一个介于a和之间的数字,忽略模式匹配和替换中的任何其他内容,因为在我的html代码中,[]中的数字可能有不同的html代码与之关联。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2014-02-10 04:57:27

已更新

算法:

代码语言:javascript
复制
use Data::Dumper;

# input
my $html = "[1],[1-2],[1,3,6],[1,3,4-6],[5]";

# result array
my @result;

# recursive way to generate html link tag
sub asHtmlLink($) {
    return "<a href=\"\#$_[0]\">$_[0]</a>";
}

# seperate by ,
foreach (split(',',$html)) {

    # match pattern
    m/(\d+)(\-)?(\d+)?/g;

    # if there is a digit after a minus
    if (defined $3) { 
        push(@result,asHtmlLink($1).$2.asHtmlLink($3));
    } else {
        push(@result,asHtmlLink($1));
    }
}

# dump
print Dumper @result;

结果:

代码语言:javascript
复制
$VAR1 = '<a href="#1">1</a>';
$VAR2 = '<a href="#1">1</a>-<a href="#2">2</a>';
$VAR3 = '<a href="#1">1</a>';
$VAR4 = '<a href="#3">3</a>';
$VAR5 = '<a href="#6">6</a>';
$VAR6 = '<a href="#1">1</a>';
$VAR7 = '<a href="#3">3</a>';
$VAR8 = '<a href="#4">4</a>-<a href="#6">6</a>';
$VAR9 = '<a href="#5">5</a>';

正则表达式链接:Regex101

票数 3
EN

Stack Overflow用户

发布于 2014-02-10 13:04:55

代码语言:javascript
复制
use strict;
use Carp::Assert 'assert';

sub replace {
  my $html = shift;

  # first expand subexpressions of the for "n-m"; (will fail if
  # n > m !)
  1 while $html =~ s{
                     (\[\s*(?:\s*\d\s*,\s*)*)     # prefix (1)
                     (\d+)\s*-\s*(\d+)            # target (2, 3)
                     (?=[^\]]*\])                 # suffix (lookahead)
                    }
                    {assert($2 <= $3),
                     $1 . join(", ", $2..$3)}ex;

  # now replace individual integers with hyperlinks
  1 while $html =~ s{
                     (\[\s*(?:\s*\d+\s*,\s*)*)    # prefix (1)
                     (\d+)                        # target (2)
                     (?=[^\]]*\])                 # suffix (lookahead)
                    }
                    {$1\n<a href="#$2">$2</a>}x;  # \n added to make
                                                  # output easier to
                                                  # to read; it's safe
                                                  # to omit it


  return $html;
}

一些非正式的测试:

代码语言:javascript
复制
for my $h ( '[1, 3-7,  10-11 ]',
            '[  0]',
            '[1  ]',
            '[ ]',
            '[ 9-19]',
            '[9-9]',
            '[19-9]',
            '[19-z]'
          ) {
  my $r = eval { replace($h); };
  if ( $@ ) {
    $r = $@;
  }
  printf "%s\n%s\n\n", $h, $r;
}

输出:

代码语言:javascript
复制
[1, 3-7,  10-11 ]
[
<a href="#1">1</a>,
<a href="#3">3</a>,
<a href="#4">4</a>,
<a href="#5">5</a>,
<a href="#6">6</a>,
<a href="#7">7</a>,
<a href="#10">10</a>,
<a href="#11">11</a> ]

[  0]
[
<a href="#0">0</a>]

[1  ]
[
<a href="#1">1</a>  ]

[ ]
[ ]

[ 9-19]
[
<a href="#9">9</a>,
<a href="#10">10</a>,
<a href="#11">11</a>,
<a href="#12">12</a>,
<a href="#13">13</a>,
<a href="#14">14</a>,
<a href="#15">15</a>,
<a href="#16">16</a>,
<a href="#17">17</a>,
<a href="#18">18</a>,
<a href="#19">19</a>]

[9-9]
[
<a href="#9">9</a>]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21664870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档