正则表达式 - 在捕获组中查找空格

Regex - Find spaces in capturing group

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

我在 excel 中有一个巨大的所有文件列表,我必须对文件名进行一些检查。

简而言之,文件名以零件号开头。部件号包含 "groups",用连字符分隔。

主要问题是用户有时会使用 spaces(随机)和连字符来进行组分隔。

我必须在列表中标记文件名,如下所示: -正确的 -相似但错误 -不匹配

类似的意思是如果组的顺序是正确的,但是组分隔不是只有一个连字符(-),而是结合一个space(s):' - ''- '' -''- ' 等..

我在 VBA 中编写了一个正则表达式宏。这很好用,但我坚持使用 "similar" 模式。

这是正则表达式中一种结构的简化版本:

^(\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-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 - 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

我可以用上面的模式标记正确和不匹配的值,但我不知道如何修改以检查什么是"similar"? 我试图在这里和 google 中搜索解决方案,但没有找到:/

谢谢

-(?: - ) 更改为 \s*-\s* 以便接受任意数量的前导 and/or 尾随白色 space,包括 none(只是一个连字符)。 (我还删除了封闭的 (?:…),因为它没有被使用。)

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

function check(elem) {
  let next = elem.nextElementSibling;
  let okay = elem.innerHTML.match(document.getElementById("okay").value);
  let sim = elem.innerHTML.match(document.getElementById("sim").value);
  if (okay) {
    next.innerHTML = " → 1=[" + okay[1] + "] 2=[" + okay[2] + "]";
    next.className = "";
  } else if (sim) {
    next.innerHTML = " → 1=[" + sim[1] + "] 2=[" + sim[2] + "]";
    next.className = "similar";
  } else {
    next.innerHTML = "";
  }
}

function go() {
  document.querySelectorAll("li pre").forEach(item => check(item));
}
li { list-style:none; }
pre { display:inline-block; }
pre, ul, li { margin-top:0; margin-bottom:0 }
input[type="text"] { width:96%; font-family:monospace; }
input { display:block; }
pre + b { color:#080; font-family:monospace; }
pre + b.similar { color:#800; }
Valid: <input type="text" id="okay" 
  value="^(\d{4}-\d{2}(?:-\d{3})?-[A-Z]\d{3}-[A-Z]) - (.*)" />
Similar: <input type="text" id="sim" 
  value="^(\d{4}\s*-\s*\d{2}(?:\s*-\s*\d{3})?\s*-\s*[A-Z]\d{3}\s*-\s*[A-Z])\s*-\s*(.*)" />
<input type="button" value="go" onclick="go()" />

<b>Correct</b>
<ul id="correct">
<li><pre>1111-22-333-A444-B - DESCR.EXT</pre><b></b></li>
<li><pre>1111-22-A444-B - DESCR.EXT</pre><b></b></li>
</ul>

<b>Similar but wrong file name</b>
<ul id="similar">
<li><pre>1111-22 -333-A444-B - DESCR.EXT</pre><b></b></li>
<li><pre>1111-22- A444-B - DESCR.EXT</pre><b></b></li>
<li><pre>1111 -22-333-A444-B - DESCR.EXT</pre><b></b></li>
<li><pre>1111  -22 - A444-  B - DESCR.EXT</pre><b></b></li>
<li><pre>1111-22-333-A444-B - DESCR.EXT</pre><b></b></li>
<li><pre>1111 - 22 -  A444 - B - DESCR.EXT</pre><b></b></li>
</ul>

<b>Non-matching filename</b>
<ul id="non-matching">
<li><pre>1111-22-333-A444 - DESCR.EXT</pre><b></b></li>
<li><pre>1111-22-B - DESCR.EXT</pre><b></b></li>
<li><pre>1111-22-333-A444-BDESCR.EXT</pre><b></b></li>
<li><pre>1111-22 - DESCR.EXT</pre><b></b></li>
<li><pre>1111-22-33-444-B - DESCR.EXT</pre><b></b></li>
<li><pre>1111-22-444-B - DESCR.EXT</pre><b></b></li>
</ul>

如您所见,倒数第二个 "similar" 文件名与您的原始正则表达式匹配。我不确定那里的目的是什么。