2013-05-08 136 views
0

我目前有这个正则表达式:this\.(.*)?\s[=,]\s,但是我遇到了一个我无法修复的泡菜。贪婪和非贪婪的正则表达式

我试过下面的正则表达式,它可以工作,但它捕获了我不想要的空间:this\.(.*)?(?<=\s)=|(?<!\s),。我想要做的是匹配标识符名称。我想要的一个例子和结果是这样的:

this.""W = blah;这将匹配""W。上面的第二个正则表达式几乎是完美的,但它也捕获了第一组中=之前的空间。有人能指出我正确的方向来解决这个问题吗?

编辑:究其原因,通配符组中不是简单地使用[^\s]是,有时我能得到线这样的:this. "$ = blah;

EDIT2:现在我有另一个问题。它不正确匹配param1.readBytes(this.=!3,0,param1.readInt());。而不是匹配=!3其匹配=!3,0。有没有办法来解决这个问题?再次,我不能简单地使用[^,],因为可能有一个名称应该与,3$匹配的名称,如param1.readBytes(this.,3$,0,param1.readInt());

+0

用什么语言写你的程序? – 2013-05-08 11:30:55

+0

所以如何判断一个逗号是属于this.identifier还是作为函数参数的分隔符? – 2013-05-08 11:33:35

+0

有没有办法在Regex中向后读取?例如,从';'开始并返回,直到你通过两个'','然后开始捕获,直到找到'this.'?或者这是不可能的...... – jduncanator 2013-05-08 11:37:28

回答

2

(.*)将匹配任何字符,包括空格。 迫使它不是空白改变它结束到(.*[^\s])

如: this\.(.*[^\s])?\s?[=,]\s

对于你的第二个编辑,好像你正在做一个语言解析器。即使正则表达式很强大,它们也有限制。你需要一个文法分析器。

+0

对不起,请参阅我的编辑,一个新的例子。 – jduncanator 2013-05-08 10:51:06

+0

然后试试这个'this \。(。* [^ \ s])?\ s?[=,] \ s' – 2013-05-08 10:53:05

+0

就像一个魅力!非常感谢你!编辑您的答案,我会将其标记为正确 – jduncanator 2013-05-08 10:55:11

1

也许你可以告诉你在第一个区块捕获非空格字符,而不是任何。

this\.(\S*)?(?<=\s)=|(?<!\s), 
+0

对不起,我会更新我的问题,字段名称中可以包含空格,这是不行的。 – jduncanator 2013-05-08 10:47:09