Regex在代码中查找变量

本文关键字:查找 变量 代码 Regex | 更新日期: 2023-09-27 18:27:46

我正在创建一个程序,使用户可以创建某种脚本。我在运行时编译了他的脚本,然后执行。我正在做一些类似的事情:https://stackoverflow.com/a/4181855/637142

总之,长话短说,基本上我必须替换所有以$开头的变量。用于使脚本可编译的内容如果用户有以下行:

var x = ($MyArray[ 4 ].Size) + 3;

什么正则表达式使我能够选择$MyArray[ 4 ].Size

如果用户在哪里写:

var x = $SomeVar;

在这种情况下,很容易找到CCD_ 2。我很难找到以$开头的变量

编辑

我想我快要找到解决办法了。现在我用单词Foo.替换$,换句话说,我替换了行:

var x = ($MyArray[ 4 ].Size) + 3;

对于

dynamic Foo; // then
var x = (Foo.MyArray[ 4 ].Size) + 3;

现在它正在编译,但我仍然需要找到Foo.MyArray[ 4 ].Size

编辑2

我不是想创建一个编译器,我只需要替换一些变量(以$开头的变量);)

Regex在代码中查找变量

听起来您正试图使用正则表达式将脚本语言转换为另一种语言。要做到这一点,所需要的远不止正则表达式所能管理的。

我强烈建议您使用现有的解析系统来管理脚本,因为他们会考虑到许多此类外部因素,并创建一种成熟的语言来使用。例如,Lua是一个常见的选择。

或者,您可能希望编写一个合适的解析器来处理将原始源代码转换为树的问题,然后可以遍历树来生成结果代码。

我不确定我是否完全理解这个问题。

你想做一个编译器?这没那么容易,我的朋友。编译器通常经历5个阶段:

  • 词汇分析
  • 正在分析
  • 语义分析
  • 优化
  • 代码生成

在我看来,你正在努力完成词汇分析阶段。如果是这样的话,有很多程序可以用来完成这项任务。其中一个工具叫做C#LEX。这是一个很好的工具,可以生成分析代码并吐出令牌的程序。

以下是LEX脚本的示例:

    %%
    ALPHABET = [a-zA-Z]*
    %%
    <YYINITIAL>{ALPHABET} { return ("STRING"); }

C#LEX获取这个.LEX文件并对其进行解析。然后它生成一个C#程序,该程序可以分析任何适合lexer指定语言的脚本。

谢谢,

  • Ro

花了太多时间后,成功地执行了regex。

所以如果我有代码:

if (0 == $Foo.Arr1[7 + Arr2_5[3-1] ].More[8].Yes-9) {
  // do something
} 

在这种情况下,我想匹配$Foo.Arr1[7 + Arr2_5[3-1] ].More[8].Yes

以下正则表达式将与之匹配:

(?xi)
(?>
      (?<Q> "      )    # quote
    | (?<C> //     )    # comment
    | (?<N> [^"'$] )    # nothing
    | (?<D> '$     )    # dollar sign
)
(?(Q) .+? ('r|'n|$|") ) # if a quote is match continue selecting until you find next quote
(?(C) .+? ('r|'n|$)   ) # if a comment // or /* is match continue selecting until end of line
(?(N) (?=(?!))        )
(?(D)                   # if dollar sign is matched then:
  (
    (?(B)(?<-B>)){15}  # make sure group has a count of 0
    (?<V> [a-z|_]     ) # variable must start with letter of under score
    (?>
            (?<B>   '[        )                   # match [
       |    (       [^'s')'(+'-@'#$%'^&'*=`~,'''|'[']] )  # or anything that is not a space, +, @ etc..
    )*
    (?(B)                                         # if you match a bracket then:
        (
           (?>
                    [^'[']]
                 |    '[ (?<numberP>)                # balance match until opening ( = closing )
                 |    '] (?<-numberP>)
            )*
            ']
            (?(numberP)(?!))
            '.? 
        )
    )  # basically if you match a bracket keep selecting until you find even number of closing ]
  )
  +   # repeat this as many times as you can
)
(?(Q)(?!))   # Make regex fail if any of the following cases
(?(C)(?!))
(?(N)(?!))