Skip to content

Instantly share code, notes, and snippets.

@tathamoddie
Created September 21, 2010 04:17
Show Gist options
  • Save tathamoddie/589179 to your computer and use it in GitHub Desktop.
Save tathamoddie/589179 to your computer and use it in GitHub Desktop.
Analysis of some interesting regular expressions
^1?$|^(11+?)\1+$
Tokens:
^ StartOfStringAssertion
1 Literal
? Quantifier
$ EndOfStringAssertion
| OrOperator
^ StartOfStringAssertion
( GroupStart
11 Literal
+? Quantifier
) GroupEnd
\ CharacterEscapeOrBackReferenceMarker
1 CharacterEscapeOctalDataOrBackReferenceNumberOrCharacter
+ Quantifier
$ EndOfStringAssertion
AST:
1. ^1?$|^(11+?)\1+$ alternation expression AlternationNode
2. ^1?$ subexpression SubExpressionNode
3. ^ start of string assertion StartOfStringAssertionNode
4. 1? zero or one times QuantifierNode{Min=0,Max=1}
5. 1 '1' character LiteralNode{Text='1'}
6. $ end of string assertion EndOfStringAssertionNode
7. | or operator OrOperatorNode
8. ^(11+?)\1+$ subexpression SubExpressionNode
9. ^ start of string assertion StartOfStringAssertionNode
10. (11+?) group number 1 GroupingNode{Number=1}
11. 1 '1' character LiteralNode{Text='1'}
12. 1+? at least once but lazy QuantifierNode{Min=1,Max=null,Lazy=true}
13. 1 '1' character LiteralNode{Text='1'}
14. \1+ one or more times QuantifierNode{Min=1,Max=null}
15. \1 back reference NumberBackReferenceNode{Ref=1}
16. $ end of string assertion EndOfStringAssertionNode
Variables:
1 = 2 or 8 = 6
4 = 0 or 1 = 2
12 = 1 or 3 = 2
14 = 1 or 3 = 2
=> 6 generated examples
Example matches:
""
when 1=2, 4=0
"1"
when 1=2, 4=1
"1111"
when 2=8, 12=1, 14=1
"11111111"
when 2=8, 12=1, 14=3
"11111111"
when 2=8, 12=3, 14=1
"1111111111111111"
when 2=8, 12=3, 14=3
=====================================================
^[a-zA-Z0-9]+((.?|\-*)[a-zA-Z0-9]+)*$
Tokens:
^ StartOfStringAssertion
[ CharacterSetStart
a Character
- CharacterRangeSeparator
z Character
A Character
- CharacterRangeSeparator
Z Character
0 Character
- CharacterRangeSeparator
9 Character
] CharacterSetEnd
+ Quantifier
( GroupStart
( GroupStart
. AnyCharacter
? Quantifier
| OrOperator
\ CharacterEscapeMarker
- CharacterEscapeData
* Quantifier
) GroupEnd
[ CharacterSetStart
a Character
- CharacterRangeSeparator
z Character
A Character
- CharacterRangeSeparator
Z Character
0 Character
- CharacterRangeSeparator
9 Character
] CharacterSetEnd
+ Quantifier
) GroupEnd
* Quantifier
$ EndOfStringAssertion
AST:
1. ^ start of string assertion StartOfStringAssertionNode
2. [a-zA-Z0-9]+ one or more times QuantifierNode{Min=1,Max=null}
3. [a-zA-Z0-9] character set CharacterSetNode
4. a-z charcter range a-z CharacterRangeNode{Min=a,Max=z}
5. A-Z charcter range A-Z CharacterRangeNode{Min=A,Max=Z}
6. 0-9 charcter range 0-9 CharacterRangeNode{Min=0,Max=9}
7. ((.?|\-*)[a-zA-Z0-9]+)* zero or more times QuantifierNode{Min=0,Max=null}
8. ((.?|\-*)[a-zA-Z0-9]+) group number 1 GroupingNode{Number=1}
9. (.?|\-*) group number 2 GroupingNode{Number=2}
10. .?|\-* alternation expression AlternationNode
11. .? subexpression SubExpressionNode
12. .? zero or one times QuantifierNode{Min=0,Max=1}
13. . any character CharacterClassNode{Class=Any}
14. | or operator OrOperatorNode
15. \-* subexpression SubExpressionNode
16. \-* zero or more times QuantifierNode{Min=0,Max=null}
17. \- '-' character LiteralNode{Text='-'}
18. [a-zA-Z0-9]+ one or more times QuantifierNode{Min=1,Max=null}
19. [a-zA-Z0-9] character set CharacterSetNode
20. a-z charcter range a-z CharacterRangeNode{Min=a,Max=z}
21. A-Z charcter range A-Z CharacterRangeNode{Min=A,Max=Z}
22. 0-9 charcter range 0-9 CharacterRangeNode{Min=0,Max=9}
22. $ end of string assertion EndOfStringAssertionNode
Variables:
2 = 1 or 3 = 12
3 = a-z or A-Z or 0-9 = 6
4 = a or d = 2
5 = A or D = 2
6 = 0 or 3 = 2
7 = 0 or 1 or 3 = 27
10 = 11 or 15 = 9
12 = 0 or 1 = 6
13 = a or A or 1 = 3
16 = 0 or 1 or 3 = 3
18 = 1 or 3 = 12
19 = a-z or A-Z or 0-9 = 6
20 = a or d = 2
21 = A or D = 2
22 = 0 or 3 = 2
=> 39 generated examples
Example matches:
"a"
when 2=1, 3=a, 7=0
"aa"
when 2=1, 3=a, 7=1, 10=11, 12=0, 18=1, 19=20, 20=a
"aA"
when 2=1, 3=a, 7=1, 10=11, 12=0, 18=1, 19=21, 22=A
"a1"
when 2=1, 3=a, 7=1, 10=11, 12=0, 18=1, 19=22, 22=1
...
=====================================================
$^
Tokens:
$ EndOfStringAssertion
^ StartOfStringAssertion
AST:
1. $ end of string assertion EndOfStringAssertionNode
2. ^ start of string assertion StartOfStringAssertionNode
Variables:
none
=> 0 generated examples
Example matches:
none
=====================================================
[a-z]]
Tokens:
[ CharacterSetStart
a Character
- CharacterRangeSeparator
z Character
] CharacterSetEnd
] Literal
AST:
1. [a-z] character set CharacterSetNode
2. a-z charcter range a-z CharacterRangeNode{Min=a,Max=z}
3. ] ']' character LiteralNode{Text=']'}
Variables:
1 = a-z = 1
2 = a or d = 2
=> 2 generated examples
Example matches:
"a]"
when 1=a-z, 2=a
"d]"
when 1=a-z, 2=d
=====================================================
[[a-z]
Tokens:
[ CharacterSetStart
[ Character
a Character
- CharacterRangeSeparator
z Character
] CharacterSetEnd
AST:
1. [[a-z] character set CharacterSetNode
2. [ '[' character CharacterNode{Character='['}
3. a-z charcter range a-z CharacterRangeNode{Min=a,Max=z}
Variables:
1 = [ or a-z = 3
3 = a or d = 2
=> 3 generated examples
Example matches:
"["
when 1=[
"a"
when 1=a-z, 3=a
"d"
when 1=a-z, 3=d
=====================================================
[[a-z]]
Tokens:
[ CharacterSetStart
[ Character
a Character
- CharacterRangeSeparator
z Character
] CharacterSetEnd
] Literal
AST:
1. [[a-z] character set CharacterSetNode
2. [ '[' character CharacterNode{Character='['}
3. a-z charcter range a-z CharacterRangeNode{Min=a,Max=z}
4. ] ']' character LiteralNode{Text=']'}
Variables:
1 = [ or a-z = 3
3 = a or d = 2
=> 3 generated examples
Example matches:
"[]"
when 1=[
"a]"
when 1=a-z, 3=a
"d]"
when 1=a-z, 3=d
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment