一组以上的正则表达式量词
Regex quantifier more than one group
我需要一个正则表达式来获取数字 1 后跟数字 0 的序列,并且总数应等于最大长度。有没有办法做类似 (([1]+)([0]+)){maxLength}
的事情?
例如:
最大长度 = 7
10 -> should not pass (total length < maxLength)
1111100 -> should match
1000000 -> should match
11110000000 -> should match 1111000.
111111111111 -> should match 1111111.
加:顺序可以是0后跟1,1的个数越大越好(不知道只用一个regex行不行)。
000000001111 -> 应该得到 0001111。
我先关注 1,然后关注 0。
我从 [1]+[0]+
开始,
在我量化 0s ([1]+)([0]{1,7})
之后,
但它仍然给出比我想要的更多的 0。
然后我在想 ([1]{7,}|[1]{6}[0]{1}|[1]{5}[0]{2}|[1]{4}[0]{3}|[1]{3}[0]{4}|[1]{2}[0]{5}|[1]{1}[0]{6})
,
好的,它有效。但是,如果 maxLength = 100,则上述解决方案不可行。
有什么方法可以计算第一个匹配组的长度,然后计算第二个匹配组与第一个匹配组的长度差吗?
或者类似 (([1]+)([0]+)){7}
的东西?
看来你只是想要:
^(?:(?=1+0*$)|(?=0+1*$))[01]{7}
这里的{7}
可以替换为最大长度减一的任意值
我尝试使用分支重置组:
0*(?|(1[10]{6})|([10]{6}1))
在线查看demo。您可以使用第一个捕获组的结果。
0*
- 0+ 文字零(贪婪)直到;
(?|
- 打开分支重置组:
(1[10]{6})
- 第一个捕获组包含文字 1 和 6 个 1 或 0。
|
- 或者:
([10]{6}1)
- 第一个捕获组最多包含 6 个 1 或 0 和一个字面上的 1。
)
- 关闭分支重置组。
我认为正则表达式可以像这样简单:
/0*([01]{7})/
示例:
const result = `
10
1111100
1000000
11110000000
111111111111
000000001111
`.split("\n").reduce((acc, str) => {
const m = str.match(/0*([01]{7})/);
m && acc.push(m[1]);
return acc
}, []);
console.log(result)
我需要一个正则表达式来获取数字 1 后跟数字 0 的序列,并且总数应等于最大长度。有没有办法做类似 (([1]+)([0]+)){maxLength}
的事情?
例如: 最大长度 = 7
10 -> should not pass (total length < maxLength)
1111100 -> should match
1000000 -> should match
11110000000 -> should match 1111000.
111111111111 -> should match 1111111.
加:顺序可以是0后跟1,1的个数越大越好(不知道只用一个regex行不行)。
000000001111 -> 应该得到 0001111。
我先关注 1,然后关注 0。
我从 [1]+[0]+
开始,
在我量化 0s ([1]+)([0]{1,7})
之后,
但它仍然给出比我想要的更多的 0。
然后我在想 ([1]{7,}|[1]{6}[0]{1}|[1]{5}[0]{2}|[1]{4}[0]{3}|[1]{3}[0]{4}|[1]{2}[0]{5}|[1]{1}[0]{6})
,
好的,它有效。但是,如果 maxLength = 100,则上述解决方案不可行。
有什么方法可以计算第一个匹配组的长度,然后计算第二个匹配组与第一个匹配组的长度差吗?
或者类似 (([1]+)([0]+)){7}
的东西?
看来你只是想要:
^(?:(?=1+0*$)|(?=0+1*$))[01]{7}
这里的{7}
可以替换为最大长度减一的任意值
我尝试使用分支重置组:
0*(?|(1[10]{6})|([10]{6}1))
在线查看demo。您可以使用第一个捕获组的结果。
0*
- 0+ 文字零(贪婪)直到;(?|
- 打开分支重置组:(1[10]{6})
- 第一个捕获组包含文字 1 和 6 个 1 或 0。|
- 或者:([10]{6}1)
- 第一个捕获组最多包含 6 个 1 或 0 和一个字面上的 1。)
- 关闭分支重置组。
我认为正则表达式可以像这样简单:
/0*([01]{7})/
示例:
const result = `
10
1111100
1000000
11110000000
111111111111
000000001111
`.split("\n").reduce((acc, str) => {
const m = str.match(/0*([01]{7})/);
m && acc.push(m[1]);
return acc
}, []);
console.log(result)