начало строки
|
v запомнить первый символ
- ---
/^(?=\d{5}$)(.)(?!\1*$)/
---------- --------
^ \1*$ - запомненный символ повторяется до конца строки,
| (?!...) - это отрицание, оно сработает если не все
| символы в строке совпадают с первым
|
\d{5}$ - ровно пять цифр и конец строки,
(?=...) - проверка делается, но символы в строке "остаются" -
остаток выражения снова будет работать с целой строкой
const regex = /^(?:(\d)(?!.*\1)){5}$/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('^(?:(\\d)(?!.*\\1)){5}$', 'gm')
const str = `12345
76523
17173`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
@SwaD已经给出了正确答案,但这里有一个检查示例,检查输入的值是否为 5 位数字并且连续没有相同的数字:
^- 行首(\d)- 存储在第一个捕获组中的第一个数字(?!\1)- 负先行检查下一个数字是否不等于第一个数字(\d)- 第二个数字,存储在第二个捕获组中(?!\1|\2)- 负先行检查下一个数字是否不等于第一个或第二个(\d)- 第三个数字,存储在第三个捕获组中(?!\1|\2|\3)- 负先行检查下一个数字是否不等于第一个、第二个或第三个(\d)- 第四个数字,存储在第四个捕获组中(?!\1|\2|\3|\4)- 负先行检查下一个数字是否不等于第一个、第二个、第三个或第四个\d- 第五位数字$- 行结束所以正则表达式确保字符串包含 5 位数字并且不会连续出现相同的数字。如果字符串与此模式匹配,则该函数
checkNumber返回,否则返回。truefalse答案恰恰相反。
要测试 5 个数字而不重复,可以使用以下正则表达式:
这个正则表达式有两个部分。第一部分
^(?!.*(\d)\1)用于检查重复数字。它使用 negative lookahead(?!...),表示接下来不应该有重复数字。在这种情况下.*(\d)\1,它会检查一行中是否有两个相同的数字。如果有这样的数字,那么检查将不会通过。第二部分
[0-9]{5}$检查字符串是否恰好包含 5 位数字,直到字符串结尾。因此,此正则表达式将检查字符串是否由 5 位数字组成且没有重复。如果您需要检查 5 位以外的号码,请指定一个不同的号码。或类似 的表达式
[0-9]{5,10}$,表示最少 5 位数字,但最多 10 位是的,存在这样的正则表达式。总共 22 个字符,一个正向前瞻,一个负向(先行断言):
该表达式检查
如果没有前向和后向的观点,那么这个问题也是可以解决的。共 525 个字符:
此处对其进行格式化,以便更容易理解结构。工作表达式不得包含空格或换行符:
下面的程序动态生成一个表达式并对其进行测试:
PS试着想出一个更短的表达方式。以上三个要求都要满足。
好吧,也许是马马虎虎的解决方案,但只有一个常规赛:)
来自@senior-pomidor的选项:
问题条件下很容易remake:
.*负面的前瞻性,不包括检查是否存在零个或多个任何字符{4}结果,我们得到以下正则表达式:
我们检查第一个捕获的数字是否重复四次。
JS 中的一个示例,因为它是内联的:
我得到以下 -
^(?:(\d)(?!.*\1)){5}$