R 中的逆向工程正则表达式?

sta*_*oob 6 regex r

我发现这个正则表达式代码(在 R 中)可以识别以下模式“类”:一组字符串中的“LETTER-NUMBER-LETTER NUMBER-LETTER-NUMBER”:

apply(my_string, 1, function(x) gsub('(([A-Z] ?[0-9]){3})|.', '\\1', toString(x)))
Run Code Online (Sandbox Code Playgroud)

根据上面的代码,“LETTER-NUMBER-LETTER NUMBER-LETTER-NUMBER”对应的正则表达式“类”似乎是“(([AZ] ?[0-9]){3})|”。

这引出了我的问题:

假设我在 R 中有以下输入:

input = "A1B 2C3"
Run Code Online (Sandbox Code Playgroud)

有什么方法可以确定该字符串中包含什么正则表达式“类”?例如,是否存在这样的功能?

output = some_function("A1B 2C3")

> output
'(([A-Z] ?[0-9]){3})|.'
Run Code Online (Sandbox Code Playgroud)

我发现这个网站(https://regex-generator.olafneumann.org/?sampleText=the%20follow%20abc&flags=i&selection=11%7CMultiple%20characters)似乎执行类似的任务 - 但有没有办法做到这一点在 R 中?例如(我不确定这是否正确):

string = c("s0me strIngz123", "someString3s", "S0M3 5t1ngs")

#imaginary conversion function

regex_class = some_function(string)

# output

           string                  regex_class
1 s0me strIngz123 ^[A-Za-z0-9]+.*[a-zA-Z]+123$
2    someString3s               ^[A-Za-z0-9]+$
3     S0M3 5t1ngs  ^[A-Za-z0-9]+ [A-Za-z0-9]+$
Run Code Online (Sandbox Code Playgroud)

R 中有某种方法可以确定不同字符串的通用“正则表达式类”吗?

谢谢你!

asd*_*-tm 1

我认为不可能制定一个通用的模式,我将尝试解释原因。

一旦 R 中几乎没有标量,我将使用 Pascal 中的数据类型术语:

  • char(字符) - 单个字符符号(字母、数字或特殊符号)在 R 中,例如,它是 的结果intToUtf8(strtoi("0x000A"))
  • string - char(字符)数组 - R 中没有完全匹配。根据我们的讨论,我们可以采用"ABC"or "ABC"[1]
  • 字符串数组(character在 R 中)。例如c("ABC", "DEF")

我们可以从 char(字符)级别到字符串数组构建我们的解释,反之亦然。

第一的。广义的算法对于char(字符)是不可能的。原因很简单。假设我们有一个 char A。广义模式可以是

  • A仅有的,
  • A或者a
  • AB或其他允许字符的有限向量(例如,来自我之前的示例:十六进制拼写中使用的字母,"A":"F"带或不带"a":"f"),
  • (大写字母,
  • (所有)字母和数字,
  • 任何字符(字母、数字、空格、标点符号和特殊字符)。

您会发现单个字符没有提供任何足够的信息来预测 的广义模式regex

第二。对于单个字符串来说,广义算法是不可能的。

  • 不可能自动预测字符串中某个字符的允许位置。
  • 没有控制论的理由来决定字符串的长度必须与样本字符串的长度相同以及知道允许的长度范围。
  • 也不可能找出字符串内必须存在(不存在)的字符组的限制。
  • 在分析单个字符串后也不可能排除此类字符串的值NA或允许的值。相反的结论也是合法的。例如,对于单个字符串,我们不能声明所有字符串都必须为空。""!is.na()== ""

因此,对单个样本字符串的分析不能唯一地限制字符的位置、字符串的长度和字符组。

第三。字符串数组也不足以构建regex.

  • 至少永远无法估计该数组是否必须至少有一个成员或者可以是null/0 长度。
  • 它必须有多少成员,一般来说,有(任何)法律规定此类成员的允许数量。

实际上,字符串数组的限制与字符串的限制有很多共同点。

结论。

基于这些考虑,我们可以得出以下结论。

  1. 至少单一模式是可能的。该模式将等于分析的字符串。
  2. 特定字符/字符串/字符串数组的模式不是唯一的,并且可以n regex根据所分析字符串的特定质量来构建 'es。n是无限的(只要我们假设允许无限长度的字符串)或者至少(非常)大。
  3. 添加机器学习和其他人工智能算法,我们可以减少n并构建更合适的regexes。但人工智能的所有结果在统计上都是有限的,并且可能具有永远达不到的更高或更低的显着性1。所以这些方法会给我们m regexes. 虽然m <= n还是m != 1m < n即使像某些regexes 形式那样值得怀疑的考虑m也不太可能,但仍然是可能的。