【问题标题】:Regex PCRE - Removing ONLY certain characters from a String正则表达式 PCRE - 仅从字符串中删除某些字符
【发布时间】:2017-10-12 13:18:11
【问题描述】:

我尝试的 PCRE 正则表达式找到第一个字符并删除它之后的所有内容。

以下是字符串示例:

$128.48 One Month TV Internet and Voice, 100GB of Fiber<sup>&dagger;</sup> Internet.

$148.48 One Month TV Internet and Voice, 200GB of Fiber<sup>&dagger;</sup> Internet and a free movie rental from MoviePlex.

我只想从字符串中提取以下字符并保持字符串的其余部分不变。摘录:&lt;sup&gt;&amp;dagger &lt;/sup&gt;

预期结果

$148.48 One Month TV Internet and Voice, 200GB of Fiber;Internet and a free movie rental from MoviePlex.

$128.48 One Month TV Internet and Voice, 100GB of Fiber; Internet.

这是我尝试过的正则表达式:

[^&dagger<sup><\/sup>]*

【问题讨论】:

  • “提取”是指删除?如果&lt;sup&gt;&amp;dagger;&lt;/sup&gt; 是静态的,则不需要正则表达式 - 只需将其替换为空字符串即可。
  • 是的,“删除”...我只需要 Regex 语法...因为我将 Regex 插入到工具中。我不是在写实际的代码/脚本。
  • 所以正则表达式可以简单地是&lt;sup&gt;&amp;dagger;&lt;/sup&gt;。根据工具风格,您可能需要转义/,即&lt;sup&gt;&amp;dagger;&lt;\/sup&gt;。检查this example
  • 上述第 1 场评论结果为: 第 1 场比赛结果应为“$128.48 一个月电视互联网和语音,100GB 光纤;互联网。”
  • 你应该替换,就像我提供的例子一样。您不能让正则表达式匹配字符串的单独部分,而不匹配其间的任何内容。 IE。在 AAABBBCCC 中,您无法匹配 AAACCC 不匹配 BBB。您可以分别捕获 AAACCC,但它们最终会在不同的捕获组中。另一种使用替换的方法是替换整个字符串,在这种情况下,您可以尝试使用(.*)&lt;sup&gt;&amp;dagger;&lt;\/sup&gt;(.*)|(.*) 捕获第一个和最后一个部分,替换为$1$2$3(或\1\2\3,具体取决于您的工具)。 See regex101 here.

标签: regex pcre


【解决方案1】:

That's how you could do this in Perl:

#!/usr/bin/perl
use strict;
use warnings FATAL => 'all';

use Data::Dumper;

my @strings = (
    '$128.48 One Month TV Internet and Voice, 100GB of Fiber<sup>&dagger;</sup> Internet.',
    '$148.48 One Month TV Internet and Voice, 200GB of Fiber<sup>&dagger;</sup> Internet and a free movie rental from MoviePlex.'
);

my @updated_strings = map { my $str = $_; $str =~ s/<sup>.+?<\/sup>/;/; $str; } @strings;

print 'UPDATED: ' . Dumper(\@updated_strings) . "\n";

您也可以在与语言无关的 regex101.com 中使用它:example

【讨论】:

    猜你喜欢
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多