我需要匹配一个长度为 10 的字符串(除空格之外的任何字符或符号),并且其中至少有一个数字(但位置不确定)。最简单的方法是什么?谢谢!(最好是在 Perl Regex 中,但实际上任何正则表达式都会阐明它。)
一些符合要求的示例字符串:
ABCD1EFGH2
AGD-D.D8HD
1414151502
[TT]88daJh
Run Code Online (Sandbox Code Playgroud)
部分样品不符合要求:
ABCDEFGHIJ # no digit
EGEGE_(**/ # no digit
asdgja8G # too short
@#21-GDKJGDE # too long
Run Code Online (Sandbox Code Playgroud)
谢谢!
更新:需要明确的是,这是一次搜索。输入字符串有数千个字符长。我需要匹配所有包含数字的 10 个字符“单词”。您可以想象一个字符串,其中包含以上 8 个单词,并用空格和制表符分隔。希望搜索仅选出前 4 个。谢谢!
更新的更新:为再次不清楚而道歉(想简化案例,但未能排除其他解释)。此正则表达式搜索的用法将是较长匹配的一部分。例如。一个 10 个字符的单词,至少有一个数字,后跟一个 4 个字符的单词,等等...因此,第一步分割长字符串不太有效。
这是一个非常重要的澄清;在较大字符串中查找您所描述的字符串类型与匹配独立字符串是一项非常不同的任务,而且要复杂得多。我认为最简单的方法是使用环视:
/(?<!\S)(?=\S{10}(?!\S))\S*\d\S*/
Run Code Online (Sandbox Code Playgroud)
(?<!\S)匹配前面没有非空白字符的位置。
(?=\S{10}(?!\S))进一步断言该位置后面紧跟着 10 个非空白字符。
一旦满足环视,\S*\d\S*就继续并消耗该字符串,假设至少一个字符是数字。
这适用于 Perl 和大多数 Perl 派生风格,如 Python、Java 和 .NET,但不适用于 JavaScript,因为 JavaScript 不支持lookbehinds。
编辑:这是一个示例,显示如何在 Perl 中迭代所有匹配项:
while ($subject =~ m/(?<!\S)(?=\S{10}(?!\S))\S*\d\S*/g) {
print("$&\n");
}
Run Code Online (Sandbox Code Playgroud)
...这是一个现场演示(其中还包括评论中讨论的优化)。
在 JavaScript 中,我会使用稍微不同的正则表达式:
var regex = /(?:\s|^)(?=\S{10}(?!\S))([^\d\s]*\d\S*)/g;
var match = regex.exec(subject);
while (match != null) {
print(match[1]);
match = regex.exec(subject);
}
Run Code Online (Sandbox Code Playgroud)
将lookbehind替换为(?:\s|^)意味着我现在正在使用前导空白字符。为了单独提取单词,我使用 捕获它()并使用 检索它match[1]。 演示