2013-05-07 60 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