使用Regex从赋值语句中捕获字段名称

时间:2013-05-07 09:29:19

标签: regex

我有一些正则表达式将某些字段名称与赋值表达式分开。到目前为止,字段名称已经足够清晰,正则表达式可以正常工作,但现在字段名称使用非法字符(从语言语法的角度来看,在这种情况下是AS3)我开发的正则表达式正在挣扎。如果我给你一个问题的前,后和详细信息,它可能是最好的。

我目前的正则表达式如下:this\.(.*)?[=,]。到目前为止,它已经起作用,因为字段名称不包含=,个字符。但是现在代码似乎被一些东西混淆了,导致字段名称变得非法,并且它不起作用。在赋值表达式之前看起来像:

this._-E12=_arg1.readInt();

当时正则表达式找到并捕获_-E12。现在,赋值表达式如下所示:

this.^"-=,#I.readInt();

正如你可以想象的那样,正则表达式不喜欢这么多并且捕获^"-=它实际上应该捕获^"-。正则表达式中的,是有原因的,并且它用于匹配像_arg1.readBytes(this._-E12, 0, count);这样的行。

我认为我正在寻找的是找到=角色的最后一个实例的一些方法,但这也不是一个完美的解决方案,因为没有办法保证我们不会得到一行看起来像:this.^"-=,=I.readInt();

这可能是一个愚蠢的问题,在Regex中可能没有办法做到这一点,但是那里有所有令人惊叹的人,并且人们已经写过正则表达式的大小,我确信必须有一些东西!


对于一些更具体的例子,这是我正在寻找的:

this.^"-=,#I.readInt();将匹配^"-

arg1.readBytes(this.^"-, 0, count);将匹配^"-

this.0$R=readInt();将匹配0$R

arg1.readBytes(this.0$R, 0, count);将匹配0$R

this.^=s=readInt();将匹配^=s

arg1.readBytes(this.^=s, 0, count);将匹配^=s

this.$s==readInt();将匹配$s=

arg1.readBytes(this.$s=, 0, count);将匹配$s=

2 个答案:

答案 0 :(得分:1)

我认为这样做会使用积极和消极的外观:

(?<=\(this\.).*?(?=,)|(?<=(?<!\()this\.).*(?==)

请注意,我在,之前使用非贪婪的通配符,否则它将捕获函数的多个参数。但是我在=之前使用了一个贪婪的通配符,以便找到最后一个=

Regexr test为您的所有示例提供了正确的答案。它是否会在更一般的情况下起作用,我无法确定。

答案 1 :(得分:0)

匹配像=这样的字符的最后一个实例是可能的:

.*=[^=]*

零个或多个,然后是=,然后是零个或多个非=个字符。

但是,您需要明确指定要匹配的案例:例如。在这些极端情况下,=应匹配为字段/值。