正则表达式 - 在捕获组中查找空格
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" 文件名与您的原始正则表达式匹配。我不确定那里的目的是什么。
我们正在使用一些文件名结构,用户必须如何保存文件。
我在 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" 文件名与您的原始正则表达式匹配。我不确定那里的目的是什么。