0

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

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

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

当时正则表达式工作 find 和 capture _-E12。现在赋值表达式如下所示:

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

正如您可以想象的那样,正则表达式不太喜欢它,而是捕获^"-=它实际上应该捕获的位置^"-。正,则表达式中的 存在是有原因的,并且它用于匹配以下行:_arg1.readBytes(this._-E12, 0, count);

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

这可能是一个愚蠢的问题,在 Regex 中可能没有办法做到这一点,但是有所有了不起的人,以及人们编写的 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=

4

2 回答 2

1

我认为这会做到这一点,使用正面和负面的环视:

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

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

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

于 2013-05-07T09:51:18.080 回答
0

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

.*=[^=]*

零个或多个任何内容,后跟一个=,然后是零个或多个非=字符。

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

于 2013-05-07T09:43:13.267 回答