Regex 就像是另一种比较 出身背景

Regex 就像是另一种比较 出身背景,regex,excel,vba,Regex,Excel,Vba,我正在开发一个游戏分析软件,我必须将句子转换成我称之为“句子模板”,并将这些句子模板与存储在Excel表格中的标准模板进行匹配。根据是否找到匹配项,需要采取一些措施。整个程序在excelvba中运行 例如,如果句子是: 传球左平T。哈利最近的防守队员 相应的句子模板为: 传球投掷$DIR$持平$NAME$最近的防守队员 因此,句子模板将句子中的“可变”单词替换为我所说的“掩码”。因此,$DIR$可以表示“left”、“right”或“center”中的任意一个,它仍然表示相同的句子模板。同样地,

我正在开发一个游戏分析软件,我必须将句子转换成我称之为“句子模板”,并将这些句子模板与存储在Excel表格中的标准模板进行匹配。根据是否找到匹配项,需要采取一些措施。整个程序在excelvba中运行

例如,如果句子是:

传球左平T。哈利最近的防守队员

相应的句子模板为:

传球投掷$DIR$持平$NAME$最近的防守队员

因此,句子模板将句子中的“可变”单词替换为我所说的“掩码”。因此,$DIR$可以表示“left”、“right”或“center”中的任意一个,它仍然表示相同的句子模板。同样地,G.琼斯可以取代T.哈里,这仍然是同一个模板

除了$DIR$和$NAME$之外,还有大约六种不同类型的口罩。大约有1200个标准模板

问题: 屏蔽是通过一个不能100%万无一失的程序来完成的,因为屏蔽的单词,特别是名称,有很多变化。例如,T.Harry可以简单地称为Harry或T.Harry(中间有空格)或Tom Harry。我需要有一些方法来确定句子中的所有其他单词是否与1200个模板中的任何一个匹配,除了面具。如果出现这种“相似”匹配,则很可能是相同的句子模板,并且如果满足某些其他过滤条件,则可以将其视为具有高度可信度的相同句子模板

口罩可以出现在句子中的任何位置,没有固定的位置

我的方法(我认为是低效的,是蛮力)

a) 使用拆分功能将1200个标准句子模板拆分为单词

b) 使用拆分功能将要比较的句子拆分为单词

c) 使用以下逻辑将“b”中的单词与循环中的1200个模板中的每一个匹配

d) 将句子模板中的单词与标准句子模板中的单词保持匹配,直到有一个单词不匹配。如果某个单词不匹配,请跳过该单词并继续下一个单词。保持匹配,直到不匹配的单词超过掩码数

e) 如果不匹配的单词超过了掩码的数量,则很可能不是同一个句子

f) 如果不匹配的单词等于或小于遮罩的数量,并且除遮罩外,所有其他单词都匹配,则在高度置信的情况下,它是相同的句子模板

有更好的方法吗?有没有办法找到两个字符串不匹配或不一致的第一个字符


谢谢你的帮助。到目前为止,我已经在句子不匹配时寻求人工干预,但如果上述逻辑有效,那就太好了。提前感谢。

如何将正则表达式与模板一起使用(例如,
^Pass-thrown.*?flat.*最近的defender$
),然后在VBA中运行这些…
可以在VBA中使用正则表达式,如下所示(示例函数):

它仍然不会打破任何速度记录,但比拆分方法更简单、更快(特别是在名称中可能有空格的情况下——正则表达式将处理这一问题)

编辑
在示例函数中,
repattern
是传入的字符串(例如,来自工作表函数调用)。
repattern
同样可以设置为单元格的值,即您的模式存储在工作表的单元格中。
因此,对于每个输入字符串,您可以在包含正则表达式模式的工作表范围内循环,并测试字符串是否匹配,如果找到匹配项,则中断循环

就从模板生成模式而言,如果所有掩码都遵循格式
$SOMETHING$
,则可以使用正则表达式进行替换,将模板生成模式:-)在VBA中使用下面的函数,在工作表中放入公式
=REGSUB(\$.\$,A1,.*?)
!享受吧

Function RegSub(ByVal repattern As String, ByVal value As String, ByVal replacement As String) As String
  RegSub = value
  Dim RegEx As Object
  Set RegEx = CreateObject("vbscript.regexp")
  With RegEx
    .Global = True      'look for global matches -> replace all
    .Pattern = repattern
  End With
  RegSub = RegEx.Replace(value, replacement)
  Set RegEx = Nothing
End Function

这似乎非常有用。但是你能不能详细解释一下hi@Peekay-哪一点需要详细说明!您好,船长,谢谢您的持续关注。如果我必须为每个模板编写/硬代码,它可能不会非常有用,因为我会在excel列中不断更新1200多个标准模板。这就是我不确定如何推进这项工作的地方。不过,这是一个很好的建议。如果您认为有一种方法可以将标准句子模板保存在一列中,并使用正则表达式将找到的模板与标准模板进行匹配,而无需硬编码,请告诉我,我将对此进行进一步研究。您好@Peekay,编辑中的信息是否为您澄清了问题?
Function RegSub(ByVal repattern As String, ByVal value As String, ByVal replacement As String) As String
  RegSub = value
  Dim RegEx As Object
  Set RegEx = CreateObject("vbscript.regexp")
  With RegEx
    .Global = True      'look for global matches -> replace all
    .Pattern = repattern
  End With
  RegSub = RegEx.Replace(value, replacement)
  Set RegEx = Nothing
End Function