在制作中发现了之前设计的文法有不足之处, 于是修改成下面的形式
1.字符转义
除 . $ ^ { [ ( | ) ] } * + ? \ 外,其他字符与自身匹配。
\t 与Tab符 \u0009 匹配。
\r 与回车符 \u000D 匹配。
\n 与换行符 \u000A 匹配。
2.字符类
[字符分组] (正字符分组。) 匹配指定字符分组内的任何字符。
[^字符分组] (负字符分组。) 匹配不在指定字符分组内的任何字符。
[第一个字符 - 最后一个字符] (字符范围。) 匹配字符范围中的任何字符。
. (句点字符。) 匹配任意字符
\l 与任何字母字符匹配。
\L 与任何非字母字符匹配。
\w 与任何单词字符匹配。
\W 与任何非单词字符匹配。
\s 与任何空白字符匹配。
\S 与任何非空白字符匹配。
\d 与任何十进制数字匹配。
\D 与任何非数字字符匹配。
[基本分组-[排除分组]] 该组字符是从一个字符类中排除另一字符类中字符的结果。
3.限定符
* 指定零个或更多个匹配
+ 指定一个或多个匹配
? 指定零个或一个匹配
{n} 指定恰好 n 个匹配
{n,} 指定至少 n 个匹配
{n,m} 指定至少 n 个但不多于 m 个匹配。
4.分组构造
(*<name>字表达式) 定义一个子表达式的别名.
(+子表达式) 捕获匹配的子表达式,按顺序从 1 开始自动编号。
(?:子表达式) 不捕获由子表达式匹配的子字符串。
(?=子表达式) 仅当子表达式在此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。
(?!子表达式) 仅当子表达式不在此位置的右侧匹配时才继续匹配。例如,\b(?!un)\w+\b 与不以 un 开头的单词匹配。
(?<name>子表达式) 将匹配的子表达式捕获到一个组名称或编号名称中。用于 name 的字符串不得包含任何标点符号,并且不能以数字开头。
\k<name> 命名后向引用,匹配名称为name的已捕获串或子表达式
5.其他
| 匹配|两边的任意一个串.使用最左侧的成功匹配。
charPattern -> char | '\'char | '['charGroup']' | '[''^'charGroup']'
charGroup -> charList+
charList -> char | (char'-'char) //如果要表达'-'也是可选字符的话,将-放在charList的第一个字符位
wordPattern -> singleToken+
sentence -> wordPattern sentence_p
sentence -> wordPattern
sentence_p -> '|'wordPattern sentence_p
sentence_p -> '|'wordPattern
singleToken -> (sentence)
singleToken -> (sentence)'?'['?']
singleToken -> (sentence)'+'['?']
singleToken -> (sentence)'*'['?']
singleToken -> (sentence) spec-count['?']
singleToken -> charPattern
singleToken -> charPattern'?'['?']
singleToken -> charPattern'+'['?']
singleToken -> charPattern'*'['?']
singleToken -> charPattern spec-count['?']
singleToken -> rename
singleToken -> capture
singleToken -> noCapture
singleToken -> yesCheck
singleToken -> noCheck
singleToken -> nameCapture
singleToken -> ref
spec-count -> '{'number'}'
spec-count -> '{'number',''}'
spec-count -> '{'number','number'}'
name -> (letter|digit)+
rename -> '(''*''<'name'>'sentence')'
capture -> '(''+'sentence')'
noCapture -> '(''?'':'sentence')'
yesCheck -> '(''?''='sentence')'
noCheck -> '(''?''!'sentence')'
nameCapture -> '(''?''<'name'>'sentence')'
ref -> '\''k''<'name'>'
regex -> sentence
现在,输入一个正则表达式,可以分析成语法树的形式了~
===================================================
输入:(CK)*(is)the(GOD)|(GOD)?(is)CK{1,2}
regex
sentence
wordPattern
singleToken
char : (
sentence
wordPattern
singleToken
charPattern
wordChar
char : C
singleToken
charPattern
wordChar
char : K
char : )
char : *
singleToken
char : (
sentence
wordPattern
singleToken
charPattern
wordChar
char : i
singleToken
charPattern
wordChar
char : s
char : )
singleToken
charPattern
wordChar
char : t
singleToken
charPattern
wordChar
char : h
singleToken
charPattern
wordChar
char : e
singleToken
char : (
sentence
wordPattern
singleToken
charPattern
wordChar
char : G
singleToken
charPattern
wordChar
char : O
singleToken
charPattern
wordChar
char : D
char : )
sentence_p
char : |
wordPattern
singleToken
char : (
sentence
wordPattern
singleToken
charPattern
wordChar
char : G
singleToken
charPattern
wordChar
char : O
singleToken
charPattern
wordChar
char : D
char : )
char : ?
singleToken
char : (
sentence
wordPattern
singleToken
charPattern
wordChar
char : i
singleToken
charPattern
wordChar
char : s
char : )
singleToken
charPattern
wordChar
char : C
singleToken
charPattern
wordChar
char : K
spec-count
char : {
number
digit
char : 1
char : ,
number
digit
char : 2
char : }