查看文章
 
正则表达式分析模块 搞定~
2008年04月10日 星期四 下午 8:34

在制作中发现了之前设计的文法有不足之处, 于是修改成下面的形式

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 : }


类别:编程+技术||添加到搜藏 |分享到i贴吧|浏览(371)|评论 (0)
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu