Perl Substitution regexp与非捕获组

时间:2015-04-24 16:23:58

标签: regex perl substitution

我在$text内存储了以下内容:

<h1>Bonjour tout le monde (diverses langues) !</h1>

<h2>Anglais</h2>

Hello World!
<quote>Every first computer program starts out "Hello World!".</quote>

<h2>Espagnol</h2>

¡Hola mundo!

<image=http://example.com/IMG/jpg/person.jpg>

我想插入一些

<p>...</p>

标记未在标记中的段落。

我试过这个

$text =~ s/(?:<.*>)*(.*)/<p>$1<\/p>/g;

但替换并不能保留我的非捕获组。它产生了这个:

<p>

</p><p>

Hello World!
</p><p>

</p><p>

¡Hola mundo!

</p><p>
</p><p></p>

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:0)

也许尝试使用仅查找不以\n开头或结尾的行的模式。我们还建议您添加<p></p>,因为您不希望每行只包含换行符来获取$text =~ s/(^[^<\n]+.+|.+[^\/\n>]+$)/<p>$1<\/p>/gm; 代码:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MCell" forIndexPath:indexPath];

switch (indexPath.row) {
    case 0:
        cell.textLabel.text = @"My Policies";
        cell.textLabel.textColor = [UIColor redColor];
        ***cell.textLabel.numberOfLines = 0;***
        break;
    case 1:
        cell.textLabel.text = @"Payment Info";
        cell.textLabel.textColor = [UIColor redColor];

        break;
    case 2:
        cell.textLabel.text = @"Policy Notes";
        cell.textLabel.textColor = [UIColor redColor];

        break;
    case 3:
        cell.textLabel.text = @"Events";
        cell.textLabel.textColor = [UIColor redColor];

        break;
    default:
        cell.textLabel.text = @"Docs";
        cell.textLabel.textColor = [UIColor redColor];

        break;
}


      return cell;
}

示例:

http://ideone.com/p55Ino

答案 1 :(得分:0)

s ///替换匹配的内容。

您可以使用

$text =~ s/((?:<.*>)*)(.*)/$1<p>$2<\/p>/g;

由前瞻或后视匹配的文本不被视为匹配的一部分。在遇到\K之前,文本都没有匹配。

$text =~ s/(?:<.*>)*\K(.*)/<p>$1<\/p>/g;

第二种解决方案需要Perl 5.10 +。