gpt4 book ai didi

regex - 解码正则表达式以了解它是否仅允许数字

转载 作者:搜寻专家 更新时间:2023-10-31 22:57:13 25 4
gpt4 key购买 nike

我收到一个正则表达式作为字符串。是否可以知道regex是否只允许数字?
我收到的regex主要有以下形式:
^[0-9]。+$
^[0-9]5,10$
^[0-9]6$
^[0-9]1,13 \w$
但我可能会收到其他的正则表达式。

最佳答案

正如大多数人所指出的,使用一个简单的regex来实现这是一个特别复杂的任务,因为有很多方法可以编写相同的东西,包括在字符类中隐藏数字的情况,或否定字符类等。尽管如此,我还是尝试了一下。测试了一下,它适用于基本场景。
下面的regex只匹配数字,而不匹配任何其他字符。它可以允许一个或多个数字,只限制特定的数字等,这并不重要。捕获regex只确保匹配的regex不匹配任何非数字。
regex匹配各种表示数字的方法,包括\d[0-9]\p{N}[123]和偶数字4但不否定字符类[^\WA-Za-z_][.-:]
regex与带有或不带定位标记的regex匹配
regex包括对所有量词的支持,包括*+?甚至{x,y}。也适用于非贪婪和占有量词,即\d*?\d*+
regex与正负lookbehinds和lookaheads一起工作。
regex包括对|的支持,例如\d?|[34]?|123
限制:
regex不支持捕获或不捕获组,因为这使得它非常复杂。因此,任何包含捕获组或非捕获组的regex都将失败,即使它们可能仅以数字表示。
regex不支持否定的字符类。例如:(..)只匹配数字,但不起作用。
虽然这并不完全是一个限制,但要指出的是,对regex的验证并没有完成。
Regex:

^\^?((\(\?\<[=!][^\(\)]*?\))?(\[\d*(?:\d-\d)?\d*\]|\\d|\\p\{N\}|\d+(?:\|\d+)*)(\*|\+|\?|\{\d*,?\d*\})?(\?|\+)?(\(\?[=!][^\(\)]*?\))?)+(?:\|(?:(?:\(\?\<[=!][^\(\)]*?\))?(\[\d*(\d-\d)?\d*\]|\\d|\\p\{N\}|\d+(\|\d+)*)(\*|\+|\?|\{\d*,?\d*\})?(\?|\+)?(\(\?[=!][^\(\)]*?\))?))*\$?$

Regex101 Demo
可视化解决方案的一个简单方法是:
^(lookbehind)?(digit_classes)+(quantifier)?(quantifier_type)?(lookahead)?

lookbehind = (?<=.. or (?<!..
digit_classes = \d or [0-9] or \p{N} etc.
quantifier = * or + or ? or {,}
quantifier_type = ? or +
lookahead = (?=.. or (?!..

// Repeat the above to support 'OR' i.e |

(:..)或第一个捕获组包括对下面详细描述的所有类型数字的支持。
第一捕获组 [^\WA-Za-z_]包括匹配的正视或负视。
((\(\?\<[=!][^\(\)]*?\))?(\[\d*(?:\d-\d)?\d*\]|\\d|\\p\{N\}|\d+(?:\|\d+)*)(\*|\+|\?|\{\d*,?\d*\})?(\?|\+)?(\(\?[=!][^\(\)]*?\))?)+包括查看的开始,即 (\(\?\<[=!][^\(\)]*?\))?后接 \(\?\<,因为它可能是正的或负的。
(?<不贪婪地允许在lookback中出现除 [=!][^\(\)]*?以外的任何字符
下一个捕获组包括匹配各种数字表示,如 ()(\[\d*(?:\d-\d)?\d*\]|\\d|\\p\{N\}|\d+(?:\|\d+)*)
\d匹配 [0-9]\p{N}甚至 [\d*(?:\d-\d)?\d*\]
[0-9]直接匹配
[1234]直接匹配
[1-3567]允许出现文本,例如“4”,也支持多个文本,例如 \\d
下一个捕获组包括匹配所有量词,即 \d\\p\{N\}\p{N}\d+(?:\|\d+)*
4|6|8表示所有基本量词
(\*|\+|\?|\{\d*,?\d*\})?支持指定最小和最大计数的量词,如 *+等。
下一个捕获组允许标记量词的类型,例如lazy,即 ?或所有格,即 {,}
下一个捕获组 \*|\+|\?允许正或负的lookaheads
在此之后,第一个捕获组将再次重复,以支持在多个数字表示之间使用 \{\d*,?\d*\},也就是说,上面的组由 \d{5,}表示,因此为了包括对 [0-9]{3,6}的支持,它被复制,就像这样,来提出最后的regex。
适用于:
^[0-9]{6}$
^[0-9]+$
^[0-9]{5,10}$
\d[0][3-9]*?\d[0-7]*?$
\d*|[0-9]+|123
\d+(?!\s)
(?<=\w)[0-9]

不适用于(但应该适用于):
(\d)*          # Capturing groups don't work
(?:\d+) # Non-capturing groups don't work
^[^\WA-Za-z_] # Negated character classes don't work

注意:所有组都在捕获组,以便更容易可视化它们。它们可以随时转换为不捕获。

关于regex - 解码正则表达式以了解它是否仅允许数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44111050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com