2016-09-19 38 views
0

我試圖找到並使用Java替換文件中,但無法得到解決。Java的正則表達式爲「雙引號和'空間

文件內容

‘產品代碼’=」 8 :{3E3CDCB6-286C-4B7F-BCA6-D347A4AE37F5}」

「產品代碼」= 「8:.NETFramework,版本= 4.5版」

我要更新第一個的GUID這是3E3CDCB6-286C-4B7F-BCA6-D347A4AE37F5

String line = "\"ProductCode\" = \"8:{3E3CDCB6-286C-4B7F-BCA6-D347A4AE37F5}\""; 
String pattern = "[\"]([P][r][o][d][u][c][t][C][o][d][e]).+([\"])(\\s)[\"][8][:][{]"; 
Pattern r = Pattern.compile(pattern); 
Matcher m = r.matcher(line); 
System.out.println(m.matches()); 

我越來越假。

請儘可能提供解決方案。

在此先感謝。

+0

在你應用了一些正則表達式之後,你的'ProductCode'的實際期望輸出是多少? –

+0

'Matcher.matches()'應該匹配整個字符串。如果你不想檢查部分匹配,使用'find()'。 – Codebender

+1

用方括號中的單個字母構造是多餘的。你可以簡單地使用'ProductCode'來代替'[P] [r] [o] [d] [u] [c] [t] [C] [o] [d] [e]''。嘗試簡化你的正則表達式。 – RealSkeptic

回答

1

「產品代碼」= 「8:{3E3CDCB6-286C-4B7F-BCA6-D347A4AE37F5}」這是以下形式:

quote + ProductCode + quote + whitespace + equals + whitespace + 
quote + number + colon + any + quote 

對於一個簡單的正則表達式是\"ProductCode\"\s*=\s*\"\d:(.+)\"

當我們逃離這個以Java字符串,我們得到\\\"ProductCode\\\"\\s*=\\s*\\\"\\d:(.+)\\\"

+0

Thanks flkes, 「\\\」ProductCode \\\「\\ s * = \\ s * \\\」\\ d:\\ {(。+)\\\「」我加了一個\\從第一產品代碼區分爲另一個產品代碼。 再次感謝。 –

1

對這個問題使用正則表達式就像拿大錘打破堅果。相當簡單:

final String line = "\"ProductCode\" = \"8:{3E3CDCB6-286C-4B7F-BCA6-D347A4AE37F5}\""; 

final String prefix = "\"ProductCode\" = \"8:{"; 
final int prefixIndex = line.indexOf(prefix); 

final String suffix = "}\""; 
final int suffixIndex = line.indexOf(suffix); 

final String guid = line.substring(prefixIndex + prefix.length(), suffixIndex); 
+0

我認爲這是一個正則表達式的有效用例。 – flakes

+1

這不是問題 - 如果一個正則表達式起作用,這是一個有效的用例。但是在有人太在意是否可以或不可能的情況下,應該問一個問題是否應該關注問題的複雜性及其解決方案。 – Smutje

+0

但是,我同意你的看法,但在這個特定場景中,我認爲使用Regex是一個更簡單(更安全)的解決方案。如果平等之間並不總是空白呢?如果某些條目以'7:{'而不是'8:{'?這些問題正是Regex擅長解決的問題;試圖爲這些場景調整這些代碼將會使這個解決方案遠比需要更復雜。 – flakes

1

嘗試這種模式:

String pattern = "^\\\"(ProductCode)\\\"\\s\\=\\s\\\"\\w\\:\\{(\\w+\\-*\\w+\\-\\w+\\-\\w+\\-\\w+)\\}\\\"$"; 
相關問題