2016-06-18 86 views
1

我有一種情況,即必須從表達式字符串中選擇變量,如下所示。用於從表達式中選擇操作數的Java正則表達式

name = 'Bruce Wayne' ||TrackId = 12 || age =9 &&sample = 7 || thisistoolong = 'asda' 

我試過模式

"(([\\d\\s\\S&&[^\\&\\|]]+)=([\\d\\s\\S&&[^\\&\\|]]+))" 

,但它似乎並沒有掃描整個字符串。

我該如何改進我的模式,以便它可以從上面的字符串中選擇'name','TrackId','age','sample'和'thisistoolong'(作爲組)。

我知道我可以使用String.split()和/或可能遞歸一個較小的模式,但我認爲如果我只是使用正則表達式來完成工作,性能會更好。 (也是一個更清潔的代碼)

編輯:thisistoolong可能是一個包含Javascript有效值的Javascript中的常規變量名稱。感謝Andreas指出邊緣情況,在變量值中可以包含'||'和'& &'。參考波希米亞的答案,我得到了使用Pattern.split()的想法,以便我可以使用預編譯的正則表達式。

+0

更容易使用'yourString.split(「||」)'並回避一個更小的模式。 – ifly6

+0

['\ w + \ s * = \ s *([\ w'] +)'](https://regex101.com/r/lP9rL1/1)? – Jan

+0

ifly6 - 我同意這個簡單的部分,但我現在遠離遞歸。如果這沒有幫助,我可能會回到這個問題上。 – NishM

回答

1

不要掛在「性能」上 - 使用split(使用正則表達式)和模式匹配器的各種解決方案都具有相同的性能,這將是很好的(通常低於0.1 ms)。

這裏是一個班輪:

String[] names = str.split(" =.*?($|\\s*(&&|\\|\\|)\\s*(?=(([^']*'){2})*[^']*$))"); 

ideone演示。

正則表達式中所有額外的東西都允許名稱和值包含&&||

+1

現在好。那麼,除非字符串文字包含'&&'或'||',當然。正則表達式不是解析器,所以我會引用[Jamie Zawinski](https://en.wikiquote.org/wiki/Jamie_Zawinski):*有些人在遇到問題時想「我知道,我會用常用表達。」現在他們有兩個問題。* – Andreas

+1

@andreas老實說,名稱中包含'||'或'&&'的可能性?真???並且可以拒絕這個嗎?什麼是空間 - 它們是否可以包含空格?在某些時候,禁止某些輸入是合理的;該API的用戶將接受合理的限制。 – Bohemian

+1

@Andreas儘管如此,我編輯了答案,允許在名稱中使用&&'和'||'。 – Bohemian