【问题标题】:Regex — Character occuring more than x number of times in a string (in different positions)正则表达式 - 在字符串中出现超过 x 次的字符(在不同位置)
【发布时间】:2016-05-20 19:33:45
【问题描述】:

我需要正则表达式来查找“@”出现超过 10 次的时间。该字符串将包含电子邮件地址,以逗号分隔,因此@s 永远不会彼此相邻。

我所拥有的是 @{10,} 仅在连续有 10 个 @s 时才有效。当字符串中有 10+ @s 时,我需要它工作。蒂亚!

【问题讨论】:

  • 从技术上讲,@ is allowed in the local part of an email address,所以只计算@s 的数量可能会给你一个不正确的结果。我认为更“正确”的方法是使用 CSV 解析器解析您的列表,但当然,这只有在您有正确引用和转义的 CSV 时才有效,因为电子邮件中也允许使用逗号。
  • 我不同意正则表达式是处理这个问题的最佳方式,但如果你坚持这样做,你可以简单地做/(\@.+){10,}/,这将允许 1 个或多个字符分隔所有10 个(或更多)@ 实例

标签: regex perl character


【解决方案1】:

要回答您的问题,您可以使用“saturn”运算符计算正则表达式中的匹配数。

use warnings;
use strict;

my $str = 'a@b.com, m@b.ca, x@c@@@d@xxxxx@@@, @';

my $count =()= $str =~ /@/g;

if ($count > 10){
    ...
}

这是一个没有中介 $count 变量的示例:

if ((() = $str =~ /@/g) > 10){

也就是说,我和其他人一起评论说正则表达式可能不是这里最好的方法。

【讨论】:

  • 呃,为什么叫山羊算子呢?你带回了可怕的回忆。
  • 我读了你的回答,想知道 saturn 运算符是什么,在这里找到另一个名字后我松了一口气。
【解决方案2】:

以下模式匹配超过 10 个@ 的字符串:

@.*@.*@.*@.*@.*@.*@.*@.*@.*@.*@

经过优化(.[^@]),去除冗余,嵌入匹配运算符后,变为如下:

/\@(?:[^\@]*\@){10}/

有一次,您说过要查找“10+”而不是“超过 10”。为此,您会使用。

/\@(?:[^\@]*\@){9}/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2015-09-30
    • 1970-01-01
    • 2019-08-04
    相关资源
    最近更新 更多