正则表达式/启发式检测重复词,例如"gfgfgfgf" "dadadada" "sdsdsd"

regex / heuristic to detect repetitive words e.g. "gfgfgfgf" "dadadada" "sdsdsd"

我们如何使用正则表达式搜索单词中的重复模式以检测“垃圾”或虚拟单词,例如“gfgfgfgfg”和类似单词,但不限制 创意 像“aweeesssoome”、“omggg”等词

示例:

  1. 在“gfgfgfgfg”的情况下正则表达式搜索/检测/结果应该是肯定的(检测到“gf”基础模式,最终构造整个单词,注意“悬挂”最后一个字符“g”)

  2. 在单词“aweesoooomee”的情况下,它应该 return 为假,因为没有使用重复模式来构造 整个单词.


重新 可能重复rsjaffe 标记:

我post在regex101.com上link的问题Detect repetitions in string has a generic and not so "smart" solution I am looking for. As explained above, the solution / variation I'm currently using considerably reduces false positives detection. Simple test可以作为证据,看看为什么不满足我的要求。

补充说明:

上述方法也检测相邻单词的重复,并限制创造性(“有效”)单词,这不是理想的效果。

示例:

“this is”——将“is”检测为 2 个单独单词中的重复(“is is”模式匹配)。

"awesoooommeee" -- 检测重复的单个字母,如“o”、“m”和“e”。


搜索这个解决方案有点难找,所以我不得不问这个问题。

首先,介绍一些背景故事:

gfgfgfgf

sdsdsdsds

dadadada

你明白了。他们是在测试自动 reCaptcha 绕过系统作为概念证明还是只是想搞笑,我不知道也不关心(很可能两者兼而有之)。

(edit) 有趣的是,没有其他 post 受到此类垃圾评论的影响。

但是,考虑到这一点,检测这些评论具有的(大部分)单个词中的模式 (99%) 并防止这些评论 posting 应该是相对简单和容易的。听起来很简单?

但是,它也必须足够好以避免误报。

例如,如果一条评论像上面那样有一个重复的单词,那么它肯定是垃圾邮件。

另一方面,如果它只是在正常句子的中间有一个拼写错误,它应该通过。

现在,我已经可以 'hear' 在下面评论为什么不使用 Akismet。或解决方案 X。或解决方案 Y。为什么不用像 DisqusFacebook 评论 这样的外部评论系统。因为,我做不到。它必须在内部。我希望简单。我已经有一些东西可以防止大量垃圾,但对于这个特殊情况,它们都失败了。

目前我测试过的解决方案:

这是一个正则表达式示例,是此答案的变体 here,但并不完美:

(.+\w)(?=+)/gu

see live regex101 example

它的问题在于,在下面的示例中,它大部分时间都会通过,但它也会触发误报:

correct/proper检测:

123123123123

daddaddaddad

sadsadasad

sadsadsad

121212121

sasasasasas

sdsdsdsds

dsdsdsdsd

ffffffff

blahblah

ioiooioioioi

popopopopop

Hi I dont think this is a spam.

improper/incorrect检测(误报):

I loooovve this. It's awesooooommeee!

现在,这很棘手。过滤器完全按照指示执行,但是,“ooovv”和“oooommeee”模式在与上面列出的第一个模式(“gfgfgfgf”等)相同的意义上并不完全重复。过滤器检测到“oo”模式重复。是的,正确,但不完全是我想要的目标。

有谁知道如何改进此正则表达式检测使其更智能一点?

谢谢!

我终于解决了!并使用单个正则表达式行:)

正在搜索 正则表达式检测重复字符串 我找到了所需的线索。

这个问题:Matching on repeated substrings in a regex and the particular answer 激发了我找到解决方案的灵感。

解决方案是使用 capturing groupsbackreference 在对上述原始答案稍作修改的正则表达式中使用,以便同时包含字母和号码:

^([a-z0-9]{2,}).*()$/gumi

示例:https://regex101.com/r/xG40cL/1

上述解决方案的另一种变体是包含单个字符,这样具有偶数个字符和奇数个字符(偶数和奇数对称)的单词也将被匹配(例如 "ooo"、"iii"等):

^([a-z0-9]{1,}).*()$/gumi

示例:https://regex101.com/r/m9aqNk/1

虽然还不完美,但肯定更好,更接近理想状态。

对不起大家这么痛苦,因为现在我明白了我正在寻找的关于正则表达式的正确术语(它叫做 backreference)。