【问题标题】:Regex - Find spaces in capturing group正则表达式 - 在捕获组中查找空格
【发布时间】:2020-05-07 22:42:09
【问题描述】:

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

我有一个庞大的 Excel 文件列表,我必须对文件名进行一些检查。

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

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

我必须像这样在列表中标记文件名: -正确的 -相似但错误 - 不匹配

相似的意思是如果组的顺序是对的,但是组的分隔不只是一个连字符(-),而是结合一个空格:' - ' or '- ' or ' -' or @987654324 @等。

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

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

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

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

谢谢

【问题讨论】:

  • 在将空格交给正则表达式之前去掉空格?

标签: regex capturing-group


【解决方案1】:

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

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

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>

如您所见,倒数第二个“相似”文件名与您的原始正则表达式匹配。我不确定那里的意图。

【讨论】:

  • 倒数第二个“相似”是我的错误。看起来又好又简单,我不知道为什么我没有考虑过:)谢谢
猜你喜欢
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
相关资源
最近更新 更多