我收到一个字符串正则表达式。是否有可能知道正则表达式是否只允许数字? 我收到的正则表达式主要是以下形式:
但我可能会收到其他正则表达式。
答案 0 :(得分:1)
像大多数人所指出的那样,使用简单的正则表达式来实现这是一项特别复杂的任务,因为有很多方法可以编写相同的东西,包括数字隐藏在字符类中的情况,或者否定尽管如此,我给了它一个镜头并对其进行了一些测试,它适用于基本场景。
以下正则表达式匹配任何仅匹配数字的正则表达式,而不匹配任何其他字符。它可能允许一个或多个数字,仅限制特定数字等。真的很重要。捕获正则表达式仅确保匹配的正则表达式不匹配任何非数字。
\d
,[0-9]
,\p{N}
,[123]
甚至文字4
,但不包括否定字符类{{ 1}}或[^\WA-Za-z_]
[.-:]
,*
,+
甚至?
。也适用于非贪婪和占有量词,即{x,y}
和\d*?
\d*+
|
的支持
<强>限制:强>
\d?|[34]?|123
捕获组或(..)
非捕获组的正则表达式都将失败,即使它们可能只是通过数字(:..)
仅匹配数字,但它无法正常工作。正则表达式:
[^\WA-Za-z_]
可视化解决方案的更简单方法是:
^\^?((\(\?\<[=!][^\(\)]*?\))?(\[\d*(?:\d-\d)?\d*\]|\\d|\\p\{N\}|\d+(?:\|\d+)*)(\*|\+|\?|\{\d*,?\d*\})?(\?|\+)?(\(\?[=!][^\(\)]*?\))?)+(?:\|(?:(?:\(\?\<[=!][^\(\)]*?\))?(\[\d*(\d-\d)?\d*\]|\\d|\\p\{N\}|\d+(\|\d+)*)(\*|\+|\?|\{\d*,?\d*\})?(\?|\+)?(\(\?[=!][^\(\)]*?\))?))*\$?$
^(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 |
或第一个捕获组包括对下面详细描述的所有类型数字的支持。
((\(\?\<[=!][^\(\)]*?\))?(\[\d*(?:\d-\d)?\d*\]|\\d|\\p\{N\}|\d+(?:\|\d+)*)(\*|\+|\?|\{\d*,?\d*\})?(\?|\+)?(\(\?[=!][^\(\)]*?\))?)+
包括匹配正面或负面外观
(\(\?\<[=!][^\(\)]*?\))?
包括开始后视,即\(\?\<
后跟(?<
,因为它可能是正面的或负面的[=!]
非贪婪地允许[^\(\)]*?
或(
以外的任何角色出现在后卫中)
包括匹配各种数字表示,例如(\[\d*(?:\d-\d)?\d*\]|\\d|\\p\{N\}|\d+(?:\|\d+)*)
或\d
或[0-9]
\p{N}
匹配[\d*(?:\d-\d)?\d*\]
或[0-9]
或[1234]
[1-3567]
直接与\\d
匹配\d
直接与\\p\{N\}
匹配\p{N}
允许存在文字,例如。 &#39; 4&#39;并支持多个文字,例如\d+(?:\|\d+)*
4|6|8
包括匹配所有量词,即(\*|\+|\?|\{\d*,?\d*\})?
,*
,+
,?
。
{,}
代表所有基本量词\*|\+|\?
支持指定最小和最大计数的量词,例如\{\d*,?\d*\}
或\d{5,}
等。[0-9]{3,6}
允许支持标记类型的量词,例如lazy即(\?|\+)?
或占有,即\d*?
\d*+
允许正面或负面前瞻 此后,第一个捕获组再次重复,以支持在多个数字表示之间使用(\(\?[=!][^\(\)]*?\))?
,即上述组由|
表示,以便包含对(..)*
的支持,像|
一样重复,以得出最终的正则表达式。
适用于:
(..)+(\|(..))*
不适合(但应该工作):
^[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]
注意:所有群组都在捕捉群组,以便更容易看到群组。它们都可以随时转换为非捕获。
答案 1 :(得分:0)
^(\d|(?<!\^)\d-\d|\\d|\^|\$|\[|\]|{\d+(,\d+)?}|\+|\*|\\b|\\B|\\\d|\(\?[:=!<][^]+\)|\?|\||\((\d|(?<!\^)\d-\d|\\d|\^|\$|\[|\]|{\d+(,\d+)?}|\+|\*|\\b|\\B|\\\d|\(\?[:=!<][^]+\)|\?|\|)+\))+$
我知道......我知道
这只匹配可以在正则表达式中匹配数字的东西。其中包括(?=My phone number is: )[\d-]+
,其与123-4567-890
中的My phone number is: 123-4567-890
匹配。
要测试RegEx是否仅匹配数字,请尝试将其与此匹配。如果它匹配任何东西,那就没关系。
这不会捕获无效的,例如\d^\d$\d
如果您发现其中有任何错误,请告知我们,我会更正。