首先,这有点被问过.但是我无法修改它以符合我的要求.
简而言之:我想要一个与表达式匹配的正则表达式,当且仅当它只包含数字时,表达式中某处有5个(或更多)连续数字.
我理解的逻辑
^(?=\d{5}$)1*2*3*4*5*6*7*8*9*0*$
Run Code Online (Sandbox Code Playgroud)
但是,这会将表达式限制为5位数.我希望能够在表达式之前和之后成为数字.所以1111345671111应该匹配,而不11111应该.
我认为这可行:
^[0-9]*(?=\d{5}0*1*2*3*4*5*6*7*8*9*)[0-9]*$
Run Code Online (Sandbox Code Playgroud)
我解释为:
^$:整个表达式必须只包含这两个符号之间的内容
[0-9]*:0- 9,0或更多次之间的任何数字后跟:
(?=\d{5}0*1*2*3*4*5*6*7*8*9*):找到至少5个增加数字的部分,后跟:
[0-9]*:0- 9,0或更多次之间的任何数字.
但是这个正则表达式是不正确的,例如11111匹配.如何使用正则表达式解决此问题?所以要匹配的表达式示例:
0000145900012345这应该不匹配:
abc123459871234444mel*_*ene 23
虽然这个问题可以使用纯正则表达式解决(严格上升的五位数字符串的集合是有限的,所以你可以枚举所有这些),但它不适合正则表达式.
也就是说,如果我不得不这样做,我就会这样做:
^\d*(?=\d{5}(\d*)$)0?1?2?3?4?5?6?7?8?9?\1$
Run Code Online (Sandbox Code Playgroud)
核心思想:0?1?2?3?4?5?6?7?8?9?匹配升序数字子字符串,但不限制其长度.每个部分都是可选的,因此它可以匹配从""(空字符串)到完整的任何内容"0123456789".
我们可以通过组合五个数字的前瞻和任意后缀(我们捕获)和后向引用\1(必须完全匹配前瞻的后缀,确保我们现在已经走在前面)来强制它恰好匹配5个字符字符串中的5个字符).
现场演示:https://regex101.com/r/03rJET/3
(顺便说一下,你的解释(?=\d{5}0*1*2*3*4*5*6*7*8*9*)是不正确的:它向前看正好匹配5位数,然后是0次或更多次出现0,然后出现0次或更多次等1)
由于事先不知道递增数字的起始位置,并且连续递增数字不会在字符串末尾结束,因此链接答案的简洁模式在这里不起作用。我认为如果不重复这是不可能的;在所有增加数字的可能性之间交替。A0后面必须跟着[1-9]. ( 0(?=[1-9])) A1后面必须跟有[2-9]。A2后面必须跟着[3-9], 依此类推。在一组中交替使用这些可能性,并重复该组四次,然后匹配此后的任何数字(前一组中最后一个重复数字的前瞻将确保第 5 个数字也按顺序排列)。
首先向前查找数字,后跟字符串末尾,然后匹配上述交替,后跟一个或多个数字:
^(?=\d+$)\d*?(?:0(?=[1-9])|1(?=[2-9])|2(?=[3-9])|3(?=[4-9])|4(?=[5-9])|5(?=[6-9])|6(?=[7-9])|7(?=[89])|8(?=9)){4}\d+
Run Code Online (Sandbox Code Playgroud)
为了更好的可读性分开:
^(?=\d+$)\d*?
(?:
0(?=[1-9])|
1(?=[2-9])|
2(?=[3-9])|
3(?=[4-9])|
4(?=[5-9])|
5(?=[6-9])|
6(?=[7-9])|
7(?=[89])|
8(?=9)
){4}
\d+
Run Code Online (Sandbox Code Playgroud)
第一行中的惰性量词\d*?没有必要,但它使模式更加高效(否则它最初会贪婪地匹配整个字符串,需要大量失败的替换和回溯,直到字符串末尾之前至少 5 个字符)
https://regex101.com/r/03rJET/2
它很丑,但很有效。
| 归档时间: |
|
| 查看次数: |
749 次 |
| 最近记录: |