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

时间:2017-05-22 10:53:43

标签: regex swift

我收到一个字符串正则表达式。是否有可能知道正则表达式是否只允许数字? 我收到的正则表达式主要是以下形式:

  • ^ [0-9] + $
  • ^ [0-9] {5,10} $
  • ^ [0-9] {6} $
  • ^ [0-9] {1,13} \ W $

但我可能会收到其他正则表达式。

2 个答案:

答案 0 :(得分:1)

像大多数人所指出的那样,使用简单的正则表达式来实现这是一项特别复杂的任务,因为有很多方法可以编写相同的东西,包括数字隐藏在字符类中的情况,或者否定尽管如此,我给了它一个镜头并对其进行了一些测试,它适用于基本场景。

以下正则表达式匹配任何仅匹配数字的正则表达式,而不匹配任何其他字符。它可能允许一个或多个数字,仅限制特定数字等。真的很重要。捕获正则表达式仅确保匹配的正则表达式不匹配任何非数字

  • 正则表达式匹配各种表示数字的方式,包括\d[0-9]\p{N}[123]甚至文字4,但不包括否定字符类{{ 1}}或[^\WA-Za-z_]
  • 正则表达式匹配带或不带锚标记的正则表达式
  • 正则表达式包括对所有量词的支持,包括[.-:]*+甚至?。也适用于非贪婪和占有量词,即{x,y}\d*?
  • 正则表达式适用于正面或负面的外观和前瞻两种方式。
  • 正则表达式包括对\d*+
  • |的支持

<强>限制:

  • 正则表达式不支持捕获或非捕获组,因为这使得它非常复杂。因此,任何包含\d?|[34]?|123捕获组或(..)非捕获组的正则表达式都将失败,即使它们可能只是通过数字
  • 正则表达式不支持否定的字符类。例如:(:..)仅匹配数字,但它无法正常工作。
  • 虽然这不是一个限制,但是想指出正则表达式的验证没有完成。

正则表达式:

[^\WA-Za-z_]

Regex101 Demo

可视化解决方案的更简单方法是:

^\^?((\(\?\<[=!][^\(\)]*?\))?(\[\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 | 或第一个捕获组包括对下面详细描述的所有类型数字的支持。

  1. 首先捕获论坛((\(\?\<[=!][^\(\)]*?\))?(\[\d*(?:\d-\d)?\d*\]|\\d|\\p\{N\}|\d+(?:\|\d+)*)(\*|\+|\?|\{\d*,?\d*\})?(\?|\+)?(\(\?[=!][^\(\)]*?\))?)+包括匹配正面或负面外观
    • (\(\?\<[=!][^\(\)]*?\))?包括开始后视,即\(\?\<后跟(?<,因为它可能是正面的或负面的
    • [=!]非贪婪地允许[^\(\)]*?(以外的任何角色出现在后卫中
  2. 下一个捕获论坛)包括匹配各种数字表示,例如(\[\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+)*
  3. 下一个捕获论坛4|6|8包括匹配所有量词,即(\*|\+|\?|\{\d*,?\d*\})?*+?
    • {,}代表所有基本量词
    • \*|\+|\?支持指定最小和最大计数的量词,例如\{\d*,?\d*\}\d{5,}等。
  4. 下一个捕获组[0-9]{3,6}允许支持标记类型的量词,例如lazy即(\?|\+)?或占有,即\d*?
  5. 下一个捕获组\d*+允许正面或负面前瞻
  6. 此后,第一个捕获组再次重复,以支持在多个数字表示之间使用(\(\?[=!][^\(\)]*?\))?,即上述组由|表示,以便包含对(..)*的支持,像|一样重复,以得出最终的正则表达式。

    适用于:

    (..)+(\|(..))*

    不适合(但应该工作):

    ^[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

如果您发现其中有任何错误,请告知我们,我会更正。