Regex-在捕获组中查找空间

Regex-在捕获组中查找空间,regex,capturing-group,Regex,Capturing Group,我们正在使用一些文件名结构,用户如何保存文件 我在excel中有一个巨大的文件列表,我必须检查一下文件名 简而言之,文件名以零件号开头。零件号包含“组”,用连字符分隔 主要问题是,用户有时(随机)使用带有连字符的空格来分隔组 我必须这样标记列表中的文件名: -正确的 -似是而非 -不匹配 类似的意思是,如果组的顺序正确,但组分隔不仅是连字符(-),而且还与空格组合在一起:'-'或'-'或'-'或'-'等 我用VBA写了一个正则表达式宏。这很有效,但我使用了“相似”模式 以下是regex中一个结构

我们正在使用一些文件名结构,用户如何保存文件

我在excel中有一个巨大的文件列表,我必须检查一下文件名

简而言之,文件名以零件号开头。零件号包含“组”,用连字符分隔

主要问题是,用户有时(随机)使用带有连字符的空格来分隔组

我必须这样标记列表中的文件名: -正确的 -似是而非 -不匹配

类似的意思是,如果组的顺序正确,但组分隔不仅是连字符(-),而且还与空格组合在一起:
'-'
'-'
'-'
'-'

我用VBA写了一个正则表达式宏。这很有效,但我使用了“相似”模式

以下是regex中一个结构的简化版本:

^(\d{4}-\d{2}(?:-\d{3})?-[A-Z]\d{3}-[A-Z])(?:-)(.*)

在本例中,感兴趣的部分是第一个捕获组,即零件号。 如您所见,在第一个捕获组中有一个非捕获组,这是可选的。 两个捕获组(零件号和说明)用“-”分隔

正确文件名的示例:

1111-22-333-A444-B - DESCR.EXT

1111-22-A444-B - DESCR.EXT
1111-22-333-A444 - DESCR.EXT

1111-22-B - DESCR.EXT

1111-22-333-A444-BDESCR.EXT

1111-22 - DESCR.EXT

1111-22-33-444-B - DESCR.EXT

1111-22-444-B - DESCR.EXT
类似但错误的文件名示例:

1111-22 -333-A444-B - DESCR.EXT

1111-22- A444-B - DESCR.EXT

1111 -22-333-A444-B - DESCR.EXT

1111  -22 - A444-  B - DESCR.EXT

1111 - 22 -  A444 - B - DESCR.EXT
不匹配文件名的示例:

1111-22-333-A444-B - DESCR.EXT

1111-22-A444-B - DESCR.EXT
1111-22-333-A444 - DESCR.EXT

1111-22-B - DESCR.EXT

1111-22-333-A444-BDESCR.EXT

1111-22 - DESCR.EXT

1111-22-33-444-B - DESCR.EXT

1111-22-444-B - DESCR.EXT
我可以用上面的模式标记正确和不匹配的值,但我不知道如何修改以检查什么是“相似的”? 我尝试在这里和谷歌搜索解决方案,但没有找到:/


谢谢

-
(?:-)
更改为
\s*-\s*
,因此可以接受任意数量的前导和/或尾随空格,包括无空格(仅连字符)。(我还删除了封装的
(?:…)
,因为它没有被使用。)

在这个交互式演示中,我有两个版本的正则表达式。一个是关于有效性(问题中的正则表达式),另一个是关于相似性,根据我上面的建议,这种相似性在间距方面更为宽松。有效条目为绿色,类似条目为红色。您可以玩弄正则表达式,并根据需要重新运行

功能检查(elem){
让next=elem.nextElementSibling;
让okay=elem.innerHTML.match(document.getElementById(“okay”).value);
让sim=elem.innerHTML.match(document.getElementById(“sim”).value);
如果(好的){
next.innerHTML=“→1=[”+好的[1]+“]2=[”+好的[2]+“]”;
next.className=“”;
}else if(sim卡){
next.innerHTML=“→1=[”+sim[1]+“]2=[”+sim[2]+“]”;
next.className=“类似”;
}否则{
next.innerHTML=“”;
}
}
函数go(){
document.queryselectoral(“li pre”).forEach(项=>检查(项));
}
li{列表样式:无;}
预{显示:内联块;}
pre,ul,li{页边距顶部:0;页边距底部:0}
输入[type=“text”]{宽度:96%;字体系列:monospace;}
输入{显示:块;}
pre+b{color:#080;字体系列:monospace;}
pre+b.similor{color:#800;}
有效:
类似的:
对的
  • 1111-22-333-A444-B-说明分机
  • 1111-22-A444-B-说明分机
相似但错误的文件名
  • 1111-22-333-A444-B-说明分机
  • 1111-22-A444-B-说明分机
  • 1111-22-333-A444-B-说明分机
  • 1111-22-A444-B-DESCR.EXT
  • 1111-22-333-A444-B-说明分机
  • 1111-22-A444-B-DESCR.EXT
不匹配的文件名
  • 1111-22-333-A444-说明分机
  • 1111-22-B-说明分机
  • 1111-22-333-A444-BDESCR.EXT
  • 1111-22-说明分机
  • 1111-22-33-444-B-说明分机
  • 1111-22-444-B-说明分机

在将其交给正则表达式之前删除空格?倒数第二个“相似”是我的错误。它看起来很好很简单,我不知道为什么我没有想到:)谢谢