2013-05-07 23 views
0

我有一些正则表达式将某些字段名称与赋值表达式分开。直到现在,字段名已足够清晰,以至于正则表达式没有问题,但现在字段名称正在使用非法字符(从语言语法的角度来看,本例中为AS3),我开发的正则表达式正在挣扎。如果我在问题的之前,之后和详细信息中提供给你,它可能是最好的。使用正则表达式从赋值语句中捕获字段名称

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

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

当时正则表达式的工作发现并抓获_-E12。现在赋值表达式是这样的:

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

正如你能想象的正则表达式不喜欢这么多,并捕获^"-=它其实应该捕获^"-代替。正则表达式中的,有一个原因,它用于匹配如下行:_arg1.readBytes(this._-E12, 0, count);

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

这可能是一个愚蠢的问题,在正则表达式中可能没有办法做到这一点,但所有令人惊叹的人在那里,以及正则表达式人写的大小,我肯定必须有一些东西!


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

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=

+0

这可能适用于正则表达式,但您将不得不精确描述要查找的内容。你如何知道'='还是'''结束了字段名? – Barmar 2013-05-07 09:37:29

+0

我不知道哪一个是我的问题。我不认为Regex可以在不使用两个单独的表达式的情况下做到这一点,并且如果两者都匹配,就可以测试。 – jduncanator 2013-05-07 09:39:28

+0

如果你不知道字段名称的结尾,你怎么可能编程计算机来做到这一点?如果你不能清楚地解释你需要什么,我们应该如何帮助你? – Barmar 2013-05-07 09:40:45

回答

1

我想这会做到这一点,利用正面和负面lookarounds:

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

注意,我,之前使用非贪婪通配符,否则会捕捉多个函数的自变量。但是我在=之前使用了一个贪婪的通配符,以便它能找到最后的=

Regexr test给出所有例子的正确答案。不管它会在更一般的情况下工作,我不能确定。

+0

谢谢!你编辑的文章现在可以运行:)我将通过我们的单元测试运行它,然后让你知道!谢啦! – jduncanator 2013-05-07 10:02:53

+0

好吧,它在一个非常普遍的情况下工作,但有一个更具体的情况我想问一下,让我编辑我的问题。 – jduncanator 2013-05-07 10:06:37

+0

在大多数情况下工作,除了以下内容:'this.faction =,#I.getInstance()。createInstance(param1.readShort())as 7 $ =;'它匹配到最后$的所有内容。 – jduncanator 2013-05-07 10:11:58

0

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

.*=[^=]* 

零个或多个的任何东西,然后是=然后零个或多个非=字符。

但是,您需要清楚指定要匹配的案例:例如,其中=应该匹配作为这些极端情况下的字段/值。

+0

我已经更新了一些更具体的情况下的问题。 – jduncanator 2013-05-07 09:46:38

+0

@jduncanator示例不是一个规范,只是提示规范。还有什么是上下文?在“函数调用”的情况下,“参数”已经被分离出来了吗? (背景问题:你是否试图避免编写解析器?) – Richard 2013-05-07 09:51:25